递归或列表理解?

时间:2011-07-09 17:43:18

标签: haskell recursion list-comprehension

通过了解一个好的Haskell ,在关于高阶函数的章节中,作者将介绍几个不同库函数的实现。当谈到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来说,它更具惯用性吗?还有别的吗?

2 个答案:

答案 0 :(得分:13)

这可能是因为列表理解只是语法糖,原则上它被翻译成递归形式。

如果作者指出要说明函数是如何实现的,那么使用列表推导快捷方式并不能真正做到这一点 - 它显示了表达解决方案的另一种方式,但不是真正的功能实现。

简而言之,它展示了如何从一组相当少的基本构建块实现。

但这是猜测 - 我自己没有阅读过该教程。

答案 1 :(得分:8)

列表理解对于一个操作中的地图和过滤器来说几乎是糖;虽然它可能在后端使用concatMap。通常使用更高抽象的东西来实现更低抽象的东西是作弊。