f#以其他方式排列

时间:2014-11-10 19:28:44

标签: list f#

您好我解决了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我试着写类似的东西,但它只能得到这个列表的总和;(。

1 个答案:

答案 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}中被传递到尚未处理的原始列表的其余部分。我使用匹配表达式来说明原始列表剩余部分的两种不同可能性:列表是空的(意味着我们已经完成),或者它不是(我们需要)返回递归调用到下一步)。