我写了这段代码,我必须将它重写为无点样式:
num_of_occ ele list = length(filter(==ele)list)
所以我这样做了:
num_of_occ ele = length . filter((==)ele)
有用。比我这样做:
num_of_occ = length . filter . (==)
而且它没有……我的思路有什么问题?
我写了这段代码,我必须将它重写为无点样式:
num_of_occ ele list = length(filter(==ele)list)
所以我这样做了:
num_of_occ ele = length . filter((==)ele)
有用。比我这样做:
num_of_occ = length . filter . (==)
而且它没有……我的思路有什么问题?
这是一个常见的错误。这是修复:
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 . (==)