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

Explanation for function composition and infix function application(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

总之就是因为这些不同的例子相当于括号的位置不同,所以对代码的求值也不同。 f <<< g,其中 fg 是函数,等价于 \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 生成一个列表,但 <<< 需要函数参数。 对于您的第三个和第四个示例,问题是相似的:如果我在第 4 个示例中显式设置 book 参数,它将是

findName fname lname = (not $ null (filter findN)) book,(你忘记了一个 $)。

not $ null $ ... 要求 ... 是一个 AddressBook,但 filter findN 是一个函数,而不是地址簿。