递归或列表理解?

JSB*_*ոգչ 9 recursion haskell list-comprehension

通过学习Haskell for Great Good,在关于高阶函数的章节中,作者将介绍几个不同库函数的实现.当filter'谈到(标准库函数的重新实现)的定义时filter,我认为显而易见的是:

filter' f xs = [x | x <- xs, f x]
Run Code Online (Sandbox Code Playgroud)

但是作者给出了以下更长的递归定义:

filter' _ [] = []  
filter' p (x:xs)   
    | p x       = x : filter' p xs  
    | otherwise = filter' p xs
Run Code Online (Sandbox Code Playgroud)

两个定义都做同样的事情.这有什么理由吗?递归定义在某种程度上更高效吗?对于Haskell来说,它更具惯用性吗?别的什么?

Ste*_*314 14

这可能是因为列表理解只是语法糖,原则上它被转换为递归形式.

如果作者的一点是要说明如何在功能实现,使用列表解析快捷方式并没有真正做到这一点 - 它显示了另一种方式来表达的解决方案,但不是一个真正的功能实现.

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

不过这是一个猜测 - 我自己没有读过这个教程.


alt*_*ive 8

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