Haskell-一种无需折叠即可生成新列表(如折叠)的更好方法

时间:2019-02-27 18:37:09

标签: haskell

如果为foldl提供了一个函数(+)和一个列表[1..10],它将生成一个最终数字。


我想要的是

[1,2,3,4,5,6,7,8,9,10]

输出将是“三角数”系列。

但给出类似列表

[3, 5, 1, 4, 7, 8, 10]

输出应为

[3, 8, 9, 13, 20, 28, 38]

我这样做的方式是通过使用

生成一个新列表

sum (take x) list

其中x是当前索引

并将其附加到新列表中。


有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

如果您查看PreludeList,您会注意到scanl旁边的功能foldl(和scanl1foldl1的计数)。那可能就是您所需要的吗?

Prelude> scanl1 (+) [3, 5, 1, 4, 7, 8, 10]
[3,8,9,13,20,28,38]

尽管它不会产生正整数之外的斐波那契。

答案 1 :(得分:3)

您正在寻找scanl1函数:

> scanl1 (+) [3,5,1,4,7,8,10]
[3,8,9,13,20,28,38]