您好我解决了ealier任务的问题。 现在,如果我有例如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时,我收到错误消息。
另一个问题,它看起来像List.Fold我试着写类似的东西,但它只能得到这个列表的总和;(。
答案 0 :(得分:0)
以下是我用折叠(带类型注释)的方法:
let orig = [2; 3; 2; 6]
let workingSum (origList:int list) : int list =
let foldFunc (listSoFar: int list) (item:int) : int list =
let nextValue =
match listSoFar with
| [] -> item
| head::_ -> head + item
nextValue::listSoFar
origList |> List.fold foldFunc [] |> List.rev
为了帮助学习折叠,这里有一个如何使用递归函数执行此操作:
let workingSum' (origList: int list): int list =
let rec loop (listSoFar: int list) (origListRemaining:int list): int list =
match origListRemaining with
| [] -> listSoFar
| remainHead::remainTail ->
let nextValue =
match listSoFar with
| [] -> remainHead
| head::_ -> head + remainHead
loop (nextValue::listSoFar) remainTail
origList |> loop [] |> List.rev
请注意,内部loop
函数的签名与前一个示例中的foldFunc
非常相似,但有一个主要区别:它不是在下一个元素中传递,而是在&#39}中被传递到尚未处理的原始列表的其余部分。我使用匹配表达式来说明原始列表剩余部分的两种不同可能性:列表是空的(意味着我们已经完成),或者它不是(我们需要)返回递归调用到下一步)。