此代码有效
findName :: String -> String -> AddressBook -> Boolean
findName fname lname = not <<< null <<< filter findN
where
findN :: Entry -> Boolean
findN entry = entry.firstName == fname && entry.lastName == lname
但这不是
findName fname lname book = not <<< null <<< filter findN book
此代码再次起作用
findName fname lname book= not $ null $ filter findN book
这不是
findName fname lname = not null $ filter findN
答案 0 :(得分:1)
简而言之,这是因为这些不同的示例等同于括号的不同放置,因此代码的评估方式不同。
其中f <<< g
和f
是函数的g
相当于\x -> f (g x)
,而f x $ g y
相当于(f x) (g y)
。
每当你有一个像<<<
的中缀符号而没有其他中缀符号时,首先评估符号左边和右边的表达式,所以你的第一个例子被评估为
findName fname lname = ((not) <<< (null) <<< (filter findN))
,
book
参数明确的是
findName fname lname book = ((not) <<< (null) <<< (filter findN)) book
,
而你的第二个例子被评估为
findName fname lname book = (not) <<< (null) <<< (filter findN book)
。
filter findN book
产生一个列表,但<<<
需要函数参数。
对于您的第三个和第四个示例,问题类似:如果我在第四个示例中明确显示book
参数,那么它将是
findName fname lname = (not $ null (filter findN)) book
,(你遗忘了一个$
)。
not $ null $ ...
要求...
为AddressBook
,但filter findN
是一个函数,而不是AddressBook。