9

我写了这段代码,我必须将它重写为无点样式:

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

所以我这样做了:

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

有用。比我这样做:

num_of_occ = length . filter . (==)

而且它没有……我的思路有什么问题?

4

1 回答 1

17

这是一个常见的错误。这是修复:

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

它与您的函数采用的参数数量有关。函数组合(.)运算符适用于具有一个参数的函数,您需要应用两次(f .) .才能使其适用于具有两个参数的函数。

Hackage 上有一个程序,如果你想玩它,它会自动将一段代码转换为无点样式。

$ cabal 安装 pointfree
$ pointfree 'num_of_occ ele list = length (filter (== ele) list)'
num_of_occ =(长度。)。筛选 。(==)

如前所述,这需要类型签名才能正常工作。造成这种情况的原因相对平凡但晦涩难懂,并且存在提高 Haskell 性能的限制。您可以打开NoMonomorphismRestriction扩展,或添加类型签名:

num_of_occ :: Eq a => a -> [a] -> Int
num_of_occ = (length .) . filter . (==)
于 2012-11-28T01:41:25.810 回答