在 Haskell 中计算前缀和的简单方法是
scanl1 (+) [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
产生输出
[1,3,6,10,15,21]
Run Code Online (Sandbox Code Playgroud)
我需要写出逆函数,这就是我想出的:
undo_prefix_sum :: (Num a) => [a] -> [a]
undo_prefix_sum s = init $ snd $
foldr (\cur (tot, l) -> (cur, (tot-cur):l))
(last s, [])
(0:s)
Run Code Online (Sandbox Code Playgroud)
这似乎是正确的(但我可能错过了一些东西)。有没有更简单或更有效的方法来做到这一点,可能使用扫描?