我正在学习《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) []
,虽然这更像是高阶函数的使用示例而不是如何“从头开始”构建一个高阶函数。 - hammar