函数组合和中缀函数应用程序的说明(PureScript)

时间:2017-07-27 21:31:16

标签: purescript

此代码有效

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

1 个答案:

答案 0 :(得分:1)

简而言之,这是因为这些不同的示例等同于括号的不同放置,因此代码的评估方式不同。 其中f <<< gf是函数的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。