假设我有一个这样的函数定义:
let sum (numbers: int list) =
// code here
有什么方法可以计算数字列表中所有其他元素的总和?因此,如果输入为[3;5;3;7]
,则结果为[(3, 15); (5, 13); (3, 15); (7, 11)]
。
我实际上对任何解决方案感兴趣,特别是那些使用功能方法的解决方案。
由于
答案 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