我似乎无法找到有关高阶函数的任何信息.我找到了几个地方的cadd参考,但在haskell api中找不到任何信息.
我只想简单地获取一个浮动列表,并通过累加每个浮点数来创建另一个列表.原始列表将始终为零.所以如果我有[0,2,5,9]的列表,我会得到[0,2,7,16]的列表.
accumulateTime :: [Float] -> [Float]
accumulateTime (x:xs) = cadd????
Run Code Online (Sandbox Code Playgroud)
我有这个代码的其他部分做事,但我似乎无法如何制作这个列表.
ham*_*mar 22
听起来你想要一个scanl与之相关的变体foldl,但会创建一个中间结果列表.因此,在foldl (+) 0对列表求和时,scanl (+) 0创建一个部分和的列表.在这里,你可能想要scanl1 (+),它在开始时不会增加额外的零.
Prelude> scanl1 (+) [0, 2, 5, 9]
[0,2,7,16]
Run Code Online (Sandbox Code Playgroud)
我认为能够将这个代码的命令版本翻译成功能样式是一个很好的技巧,从长远来看.以下是我将如何用其中一种野蛮的命令式语言解决这个问题:
var acc = 0;
for each x in xs:
acc = x + acc
yield acc
Run Code Online (Sandbox Code Playgroud)
请注意,我们在这里有两个变量 - 数字列表和滚动总和.当我们将这段代码转换为函数样式时,通常必须将循环转换为(尾部)递归并将变量转换为函数参数(因为这是他们可以"变异"的唯一地方).
accum_helper acc list
Run Code Online (Sandbox Code Playgroud)
我们现在可以尝试解决基本情况......
accum_helper acc [] = ...
Run Code Online (Sandbox Code Playgroud)
......递归的情况
accum_helper acc (x:xs) = ...
Run Code Online (Sandbox Code Playgroud)
...最后使用父函数进行变量初始化
accumulate xs = accum_helper 0 xs
Run Code Online (Sandbox Code Playgroud)