除非与点运算符一起使用,否则函数组合不起作用

时间:2014-09-07 14:31:52

标签: haskell

为什么第一种情况可以正常但不是第二种情况?我相信 。运算符链接函数,因为f返回布尔值我可以“不”它,但为什么它在第二种情况下不起作用?

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

1 个答案:

答案 0 :(得分:9)

这是因为not . fnot f之间存在差异。如果你想在不使用.的情况下这样做,你将不得不使用lambda:

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 Bool本身,而不是返回一个的函数。 a -> BoolBool之间存在很大差异。 not的定义是

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

因此,如果f本身不是TrueFalse,那么您就无法将not应用于此。

(哇,这个解释中没有否定)