我一直试图在过去的几个小时内弄清楚这一点,但却没有成功。
我们说我有一个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列表而不适用于列表列表。从这里开始接下来的步骤是什么。
答案 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
,在我看来,它看起来好一点,而不是折叠。但我更喜欢第一种解决方案。