这段代码起作用
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发布于 2017-07-28 07:25:40
简而言之,这是因为这些不同的示例等效于不同位置的括号,因此代码的计算方法也不同。f <<< g,其中f和g是函数,等价于\x -> f (g x),而f x $ g y等价于(f x) (g y)。每当您有像<<<这样的infix符号而没有其他infix符号时,首先计算符号左边和右边的表达式,因此您的第一个示例被计算为
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。
https://stackoverflow.com/questions/45361366
复制相似问题