我希望定义一个函数,该函数计算列表中满足给定谓词的元素数量:
number_of_elements :: (a -> Bool) -> [a] -> Int
number_of_elements f xs = length (filter f xs)
例如: number_of_elements (==2) [2,1,54,1,2]
应该返回2。
我们可以写得更短:
number_of_elements f = length . filter f
有没有可能不使用f参数来编写它?
((.).(.))
。尽管如此,我个人不太建议采用这种风格。 - Thomas Ahlenumber_of_elements f = length . filter f
。通常这样最易读懂。 - Daniel Fischerlength (filter f xs)
更容易阅读,而number_of_elements f xs
需要我查找你的函数定义、文档或通过类型推断来弄清楚它的作用;而前者则是我已经理解的两个函数的简单结合使用——而且写起来更短!我只会在where
绑定中将其定义为辅助函数,或作为未导出的模块函数——即使这样,也只有在它将成为其他函数的参数时才会定义。 - Luis Casillaslength (filter f xs)
更多的东西,我建议在 is7s 的答案中定义(.:)
组合子,并根据需要使用length .: filter
,但即使这样也有点傻。 - C. A. McCann