计算Haskell中的列表累积和

Cat*_*yLu 15 haskell

编写一个返回列表运行总和的函数.例如,[1,2,3,5]是[1,3,6,11].我在下面编写这个函数,它可以返回列表中所有值的最终总和.那我怎么能逐个分开呢?

sumlist' xx=aux xx 0
    where aux [] a=a
          aux (x:xs) a=aux xs (a+x)
Run Code Online (Sandbox Code Playgroud)

Zac*_*h L 32

我想你想要一个scanl1和(+)的组合,所以像

scanl1 (+) *your list here*
Run Code Online (Sandbox Code Playgroud)

scanl1将在列表中应用给定函数,并将每个中间值报告给返回的列表.

比如,用伪代码写出来,

scanl1 (+) [1,2,3]
Run Code Online (Sandbox Code Playgroud)

会输出如下列表:

[1, 1 + 2, 1 + 2 + 3]
Run Code Online (Sandbox Code Playgroud)

或换句话说,

[1, 3, 6]
Run Code Online (Sandbox Code Playgroud)

了解你Haskell有许多很好的例子和描述扫描,折叠,以及更多Haskell的好东西.

希望这可以帮助.


sep*_*p2k 9

您可以通过简单地a+x在每个步骤的结果前面并使用空列表作为基本案例来调整您的函数以生成列表:

sumlist' xx = aux xx 0
    where aux [] a = []
          aux (x:xs) a = (a+x) : aux xs (a+x)
Run Code Online (Sandbox Code Playgroud)

然而,更像惯用的Haskell将这种事物表达为折叠或扫描.