通过了解一个好的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来说,它更具惯用性吗?还有别的吗?
答案 0 :(得分:13)
这可能是因为列表理解只是语法糖,原则上它被翻译成递归形式。
如果作者指出要说明函数是如何实现的,那么使用列表推导快捷方式并不能真正做到这一点 - 它显示了表达解决方案的另一种方式,但不是真正的功能实现。
简而言之,它展示了如何从一组相当少的基本构建块实现。
但这是猜测 - 我自己没有阅读过该教程。
答案 1 :(得分:8)
列表理解对于一个操作中的地图和过滤器来说几乎是糖;虽然它可能在后端使用concatMap。通常使用更高抽象的东西来实现更低抽象的东西是作弊。