isListEmpty ::((a -> Bool) -> [a] -> [a]) -> Bool
isListEmpty f | length f == 0 = True
| otherwise = False
Первый параметр вашей функции isListEmpty
— это функция, которой вы дали имя f
и ее тип (a -> Bool) -> [a] -> [a].
, и вы передаете f
в length
, это не работает, потому что функция length
принимает типы с сигнатурой [a]
и создает тип Int
.
Вы можете увидеть это, зайдя в ghci и набрав :t length
, что даст [a] -> Int
.
Если вы сначала примените f к списку, который имеет тип [a]
, то вы можете использовать length
и ==0
, чтобы проверить, пуст ли он. Однако функция null
является идиоматическим методом проверки того, пуст ли список или нет, поэтому я рекомендую использовать ее вместо этого.
Изменить добавить пример того, как написать аналогичную функцию.
Допустим, я хотел найти длину списка после выполнения другой функции, такой как drop, init и т. д. Сначала просто напишите функцию полностью со всеми аргументами:
manipulateList :: ([a] -> [a]) -> [a] -> Int
manipulateList fn lst = length (fn lst)
Вместо length (fn lst)
мы можем переписать это с функциональной композицией (length.fn) lst
manipulateList :: ([a] -> [a]) -> [a] -> Int
manipulateList fn lst = (length.fn) lst
Теперь вы можете отменить lst
с обеих сторон так же, как в алгебраическом уравнении.
manipulateList :: ([a] -> [a]) -> Int
manipulateList fn = (length.fn)
Теперь у нас есть функция более высокого порядка, которая принимает функцию fn
и находит длину списка после применения к ней fn
.
person
Davorak
schedule
27.01.2013
isListEmpty (filter (\(x,y,_,_,_)-> x == user && y == pass ) y)
. другими словами, функция фильтра является аргументом. - person Afflatus   schedule 27.01.2013