List f#以其他方式列出总和

List f#以其他方式列出总和,list,f#,List,F#,你好,我解决了早期任务的问题。 现在,如果我有一个例子list=[2;3;2;6],我想把它翻译成这样[2;5;7;13] 我声明x为我的第一个元素,xs为我的剩余元素,并使用List.scan。下面的想法 (fun x n -> x + n) 0 but this make something like this val it : int list = [0; 2; 5; 7; 13] 如何使用任何起始参数重写它,使列表看起来像[2;5;7;13]。当我删除

你好,我解决了早期任务的问题。 现在,如果我有一个例子list=[2;3;2;6],我想把它翻译成这样[2;5;7;13]

我声明x为我的第一个元素,xs为我的剩余元素,并使用List.scan。下面的想法

  (fun x n -> x + n) 0     
but this make something like this    
   val it : int list = [0; 2; 5; 7; 13]
如何使用任何起始参数重写它,使列表看起来像[2;5;7;13]。当我删除0时,会收到错误消息


另一个问题是这个列表看起来如何。我试图写一些类似的东西,但它只能得到这个列表的总和;(.

以下是我将如何使用折叠(带有类型注释)来实现这一点:

let orig=[2;3;2;6]
let workingSum(origList:int list):int list=
let foldFunc(listSoFar:int list)(项:int):int list=
设nextValue=
将列表与
|[]->项目
|标题::->head+项目
下一个值::listSoFar
origList |>List.fold foldFunc[]|>List.rev
为了帮助学习折叠,以下是我将如何使用递归函数:

let workingSum'(origList:int list):int list=
let rec循环(listSoFar:int list)(origListRemaining:int list):int list=
将origListRemaining与
|[]->listSoFar
|remainHead::remainTail->
设nextValue=
将列表与
|[]->剩余
|head::->head+remainHead
循环(nextValue::listSoFar)保持不变
origList |>loop[]|>List.rev

请注意,内部
循环
函数的签名与上一个示例的
foldFunc
非常相似,但有一个主要区别:它不是传递到下一个元素中,而是传递到原始列表中尚未处理的剩余部分。我使用匹配表达式来解释two原始列表剩余部分的不同可能性:要么列表是空的(意味着我们完成了),要么不是空的(我们需要返回一个递归调用到下一步)。

只需获取输出列表的尾部:
list |>list.scan(+)0 |>list.tail
谢谢;)我需要一个:)有没有关于如何使用折叠的提示?你能解释一下它是如何工作的吗?为什么我以后必须重新修订列表?我想学点东西:PSure。折叠正在构建的状态本身就是一个列表。当折叠运行时,对每个元素依次执行foldFunc。fold函数有两个步骤:首先,确定需要添加到状态列表中的值;第二个选项使用传入的状态列表约束该元素以生成新状态。它实际上类似于尾部递归调用,我添加了一个递归函数来做同样的事情。你能遵循它吗?归根结底,列表就是一个堆栈,对吗?因此,在将一个堆栈处理为另一个堆栈时,您将以相反的顺序获取堆栈中的项目,这就是我的方法,在这两种方法的末尾都有一个
List.rev
调用