返回列表中子列表的总和

时间:2016-09-29 12:00:51

标签: f#

我一直试图在过去的几个小时内弄清楚这一点,但却没有成功。

我们说我有一个int列表

let list = [[1;3;4;4];[1;3]]

我必须创建一个函数来汇总子列表并返回一个列表,如下所示:

[12;4]

我被告知我应该使用List.fold。

我尝试过以下方法:

let list = [2;3;5]
let sumList list = List.fold (fun acc elem -> acc + elem) 0 list
sumList list

这只返回一个int,仅适用于int列表而不适用于列表列表。从这里开始接下来的步骤是什么。

1 个答案:

答案 0 :(得分:6)

尝试:

list 
|> List.map List.sum

因此,您为列表中的每个元素映射List.sum。

或者折叠:

list 
|> List.map (List.fold (+) 0)

(List.fold (+) 0)与sum函数相同。它从零开始,并在每次迭代中将值添加到累加器。

list 
|> List.fold (fun acc v -> 
    acc @ [(List.fold (+) 0) v]) []

如您所见,您还可以用折叠替换地图。

list 
|> List.foldBack (fun v acc -> 
    (List.fold (+) 0 v) :: acc) 
    <| []

使用List.foldBack,在我看来,它看起来好一点,而不是折叠。但我更喜欢第一种解决方案。