Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell在扫描后删除0元素_Haskell - Fatal编程技术网

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
从index
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=扫描(+)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的对象(尽管在这种情况下,编译器可能会推断其中一个对象具有错误的类型签名,但它会首先命中复制并停止)。