我一直试图在过去的几个小时内解决这个问题但没有成功.
假设我有一个int列表列表
let list = [[1;3;4;4];[1;3]]
Run Code Online (Sandbox Code Playgroud)
我必须创建一个函数来汇总子列表并返回一个列表,如下所示:
[12;4]
Run Code Online (Sandbox Code Playgroud)
我被告知我应该使用List.fold.
我尝试过以下方法:
let list = [2;3;5]
let sumList list = List.fold (fun acc elem -> acc + elem) 0 list
sumList list
Run Code Online (Sandbox Code Playgroud)
这只返回一个int,仅适用于int列表而不适用于列表列表.接下来的步骤是什么?
尝试:
list
|> List.map List.sum
Run Code Online (Sandbox Code Playgroud)
因此,您为列表中的每个元素映射List.sum.
或者折叠:
list
|> List.map (List.fold (+) 0)
Run Code Online (Sandbox Code Playgroud)
(List.fold (+) 0)与sum函数相同.它从零开始,并在每次迭代中将值添加到累加器.
list
|> List.fold (fun acc v ->
acc @ [(List.fold (+) 0) v]) []
Run Code Online (Sandbox Code Playgroud)
如您所见,您还可以使用折叠替换地图.
list
|> List.foldBack (fun v acc ->
(List.fold (+) 0 v) :: acc)
<| []
Run Code Online (Sandbox Code Playgroud)
有了List.foldBack它看起来在我看来比折更好一点.但我更喜欢第一种解决方案.