Это происходит потому, что есть разница между 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
к нему.
(Уф, это не негативы в этом объяснении)
Я предполагаю, что есть люди, которые вы хотели бы класс 'Booly – leftaroundabout
К сожалению другой вопрос, связанный с этим, почему следующее не работает«пусть дд хз = map (* 2). filter odd xs ", но когда я удаляю xs с обеих сторон, он делает –
ah неважно, я нашел ответ http://www.haskell.org/haskellwiki/Pointfree –