F#列表中所有其他元素的总和

时间:2017-06-15 12:54:16

标签: f# functional-programming

假设我有一个这样的函数定义:

let sum (numbers: int list) =
    // code here

有什么方法可以计算数字列表中所有其他元素的总和?因此,如果输入为[3;5;3;7],则结果为[(3, 15); (5, 13); (3, 15); (7, 11)]

我实际上对任何解决方案感兴趣,特别是那些使用功能方法的解决方案。

由于

2 个答案:

答案 0 :(得分:13)

您可以通过对列表求和,然后为列表中的每个元素(x, sum - x)返回x元组来非常天真地执行此操作:

let sum (numbers: int list) : (int * int) list = 
    let s = List.sum numbers
    numbers |> List.map(fun x -> (x, s-x))

let nums = [3;5;3;7]
printfn "%A" (sum nums) // [(3, 15); (5, 13); (3, 15); (7, 11)]

答案 1 :(得分:4)

您可以应用mapFold并使用状态查看是否已找到第一个匹配项。

let excludeAndSum (numbers: int list) i = 
    numbers 
    |> Seq.mapFold (fun c i' -> (i', c||i<>i'), c||i=i') false |> fst
    |> Seq.filter snd
    |> Seq.sumBy fst

let sum numbers = 
    List.map (fun i -> i , excludeAndSum numbers i) numbers