返回列表中子列表的总和

Jul*_*afl 6 f#

我一直试图在过去的几个小时内解决这个问题但没有成功.

假设我有一个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列表而不适用于列表列表.接下来的步骤是什么?

Pet*_*bke 6

尝试:

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它看起来在我看来比折更好一点.但我更喜欢第一种解决方案.

  • 并且不要忘记`(list,[])||> List.foldBack(fun v acc - >(List.fold(+)0 v):: acc)`,我发现它比上一个解决方案更具可读性(使用`<|`). (2认同)