【发布时间】:2011-10-01 23:00:48
【问题描述】:
Working through Learn You a Haskell For Great Good,在关于高阶函数的章节中,作者介绍了几个不同库函数的实现。当谈到filter'(标准库函数filter的重新实现)的定义时,我认为显而易见的是:
filter' f xs = [x | x <- xs, f x]
但作者给出了以下更长的递归定义:
filter' _ [] = []
filter' p (x:xs)
| p x = x : filter' p xs
| otherwise = filter' p xs
两个定义做同样的事情。这有什么原因吗?递归定义是否更高效?对 Haskell 来说更惯用吗?还有什么?
【问题讨论】:
-
filter'也可以用高阶函数foldr来写,就像在filter' p = foldr (\x ys -> if p x then x : ys else ys) []中一样,尽管这将是使用高阶函数的一个更好的例子,而不是如何“从头开始”构建一个。 -
如果您对它们如何脱糖感兴趣,请参阅Haskell 2010 > Expressions > List Comprehensions。
标签: haskell recursion list-comprehension