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

Roh*_*rma 0 haskell

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

*Main> let filterNot f xs = filter (not . f) xs
*Main> let filterNot f xs = filter (not (f)) xs
Run Code Online (Sandbox Code Playgroud)

bhe*_*ilr 9

这是因为not . f和之间存在差异not f.如果你想不使用它.,你将不得不使用lambda:

filterNot f xs = filter (\x -> not (f x)) xs
Run Code Online (Sandbox Code Playgroud)

但这恰恰是定义.!

(.) :: (b -> c) -> (a -> b) -> (a -> c)
f . g = \x -> f (g x)
Run Code Online (Sandbox Code Playgroud)

仅仅因为f返回a Bool并不意味着你可以not.你只能not是一个Bool自己,而不是一个返回一个的函数.a -> Bool和之间存在很大差异Bool.定义not

not :: Bool -> Bool
not True = False
not False = True
Run Code Online (Sandbox Code Playgroud)

因此,如果f它本身不是TrueFalse完全没有,那么你就不能适用not它.

(哇,在这个解释中,这不是负面的)