将表达式转换为无点样式(Haskell)

时间:2012-11-28 01:32:25

标签: haskell functional-programming pointfree

我编写了这段代码,我必须将其重写为pointfree样式:

num_of_occ ele list = length(filter(==ele)list) 

所以我这样做了:

num_of_occ ele = length . filter((==)ele)

有效。比我这样做:

num_of_occ = length . filter . (==)

它没有......我的思路有什么不对?

1 个答案:

答案 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 . (==)

如上所述,这需要类型签名才能正常工作。其原因相对平凡但不明确,并且存在改进Has​​kell性能的限制。您可以启用NoMonomorphismRestriction扩展程序,或添加类型签名:

num_of_occ :: Eq a => a -> [a] -> Int
num_of_occ = (length .) . filter . (==)