我编写了这段代码,我必须将其重写为pointfree样式:
num_of_occ ele list = length(filter(==ele)list)
所以我这样做了:
num_of_occ ele = length . filter((==)ele)
有效。比我这样做:
num_of_occ = length . filter . (==)
它没有......我的思路有什么不对?
答案 0 :(得分:16)
这是一个常见的错误。这是修复:
num_of_occ = (length .) . filter . (==)
它与您的函数所使用的参数数量有关。函数组合(.)
运算符使用一个参数处理函数,需要将它应用两次(f .) .
以使其适用于具有两个参数的函数。
实际上有一个关于Hackage的程序会自动将一段代码转换为免费样式,如果你想玩它的话。
$ cabal install pointfree $ pointfree 'num_of_occ ele list = length (filter (== ele) list)' num_of_occ = (length .) . filter . (==)
如上所述,这需要类型签名才能正常工作。其原因相对平凡但不明确,并且存在改进Haskell性能的限制。您可以启用NoMonomorphismRestriction
扩展程序,或添加类型签名:
num_of_occ :: Eq a => a -> [a] -> Int
num_of_occ = (length .) . filter . (==)