2014-09-07 4 views
0

Почему первый случай работает нормально, но не второй? Я верю . оператор связывает функцию и, поскольку f возвращает Boolean, я мог бы «не», но почему это не работает во втором случае?Состав функции не работает, если не используется с оператором точек

*Main> let filterNot f xs = filter (not . f) xs 
*Main> let filterNot f xs = filter (not (f)) xs 

ответ

9

Это происходит потому, что есть разница между not . f и not f. Если вы хотите сделать это без использования ., вам придется использовать лямбда:

filterNot f xs = filter (\x -> not (f x)) xs 

Но это именно определение .!

(.) :: (b -> c) -> (a -> b) -> (a -> c) 
f . g = \x -> f (g x) 

Просто потому, что f возвращает Bool не означает, что вы можете not его. Вы можете использовать только not a Bool, а не функцию, которая возвращает ее. Существует большая разница между a -> Bool и только Bool. Определение not является

not :: Bool -> Bool 
not True = False 
not False = True 

Так что если f само по себе не True или False точно, то вы не можете применить not к нему.

(Уф, это не негативы в этом объяснении)

+0

Я предполагаю, что есть люди, которые вы хотели бы класс 'Booly – leftaroundabout

+0

К сожалению другой вопрос, связанный с этим, почему следующее не работает«пусть дд хз = map (* 2). filter odd xs ", но когда я удаляю xs с обеих сторон, он делает –

+0

ah неважно, я нашел ответ http://www.haskell.org/haskellwiki/Pointfree –

Смежные вопросы