Haskell在扫描后删除0个元素
我正在尝试使用scanl()来保持列表的运行总和。0虽然我想删除它,但我目前在我的列表中得到一个。我试图使用take 1从索引中获取所有内容,1尽管它不起作用。
输入: [3,5,1,6,2,8,1]
预期输出:[3,8,9,15,17,25,26]
电流输出:[0,3,8,9,15,17,25,26]
ongoingSum :: [Int] -> [Int]
ongoingSum = scanl (+) 0
ongoingSum = take 1
运行上述代码时,出现以下错误:
Multiple declarations of ‘ongoingSum’
Declared at: hello.hs:17:1
hello.hs:18:1
|
18 | ongoingSum = drop 1
我怎样才能得到我想要的输出?
回答
如果您scanl出于某种原因想继续使用,那么正确的使用方法drop 1是将其与您的原始函数与.运算符组合,如下所示:
ongoingSum :: [Int] -> [Int]
ongoingSum = drop 1 . scanl (+) 0
但是,有一个更好的解决方案:scanl1改为使用:
ongoingSum :: [Int] -> [Int]
ongoingSum = scanl1 (+)
不同的是,例如foldl1,scanl1是不是局部的,对空列表将不会失败,所以没有缺点,而好处是,而不是有你要扔掉一个额外的元素,它只是从来没有在所有生成的。