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 (+)

不同的是,例如foldl1scanl1是不是局部的,对空列表将不会失败,所以没有缺点,而好处是,而不是有你要扔掉一个额外的元素,它只是从来没有在所有生成的。


以上是Haskell在扫描后删除0个元素的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>