Haskell在扫描后删除0元素
我试图使用Haskell在扫描后删除0元素,haskell,Haskell,我试图使用scanl()来保持列表的运行总和。我当前在列表中得到一个0,尽管我想删除它。我曾尝试使用take 1从index1获取所有内容,尽管它不起作用 输入:[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=扫描(+)0 ongoingSum=取1 运行上述代码时,我得到以下错误: “ongoingSum”的多个声明 声明时间:你好。
scanl()
来保持列表的运行总和。我当前在列表中得到一个0
,尽管我想删除它。我曾尝试使用take 1
从index1
获取所有内容,尽管它不起作用
输入:[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=扫描(+)0
ongoingSum=取1
运行上述代码时,我得到以下错误:
“ongoingSum”的多个声明
声明时间:你好。hs:17:1
你好,hs:18:1
|
18 | ongoingSum=下降1
如何获得所需的输出?如果出于某种原因想继续使用
scanl
,那么使用drop 1
的正确方法是使用
操作符与原始函数组合,如下所示:
ongoingSum :: [Int] -> [Int]
ongoingSum = drop 1 . scanl (+) 0
但是,有一个更好的解决方案:只需使用scanl1
:
ongoingSum :: [Int] -> [Int]
ongoingSum = scanl1 (+)
不像,例如,
foldl1
,scanl1
不是局部的,在空列表上不会失败,所以没有缺点,优点是,你不会扔掉额外的元素,它根本不会生成。如果你出于某种原因想继续使用scanl
,然后使用drop 1
的正确方法是使用
操作符将其与原始函数组合,如下所示:
ongoingSum :: [Int] -> [Int]
ongoingSum = drop 1 . scanl (+) 0
但是,有一个更好的解决方案:只需使用scanl1
:
ongoingSum :: [Int] -> [Int]
ongoingSum = scanl1 (+)
不像,例如,
foldl1
,scanl1
不是局部的,在空列表上不会失败,所以没有缺点,优点是,你不会扔掉额外的元素,它根本不会生成。你很接近,只需使用drop
而不是take
@RobinZigmond仍然会收到相同的错误。约瑟夫下面的回答是正确的方法,但只是对您收到的错误消息的一个注释-它会准确地告诉您出了什么问题。您两次声明了ongoingSum
。编译器无法判断您是否试图将onGoingSum定义为执行扫描的对象或执行take的对象(虽然在本例中,编译器可能会推断其中一个具有错误的类型签名,但它会首先命中复制并停止)。您很接近,只需使用drop
而不是take
@RobinZigmond仍然会收到相同的错误。约瑟夫下面的回答是正确的方法,但只是对您收到的错误消息的一个注释-它会准确地告诉您出了什么问题。您两次声明了ongoingSum
。编译器无法判断您是否试图将onGoingSum定义为执行扫描的对象或执行take的对象(尽管在这种情况下,编译器可能会推断其中一个对象具有错误的类型签名,但它会首先命中复制并停止)。