在嵌套列表f#上汇总项目

时间:2018-04-22 04:11:49

标签: list recursion f# functional-programming

我想分别对列表列表中的每个第n个元素求和。即。

[[3;2;1]; [4;3;5]] should sum to [7;5;6]

所有嵌套列表都具有相同的长度,但此长度未知。在示例中它是3,但可能是4,5或6.我知道如何在程序上执行它但我需要在F#中使用功能解决方案。感谢

2 个答案:

答案 0 :(得分:2)

计算总和的一种方法是:

let sum = List.reduce (List.map2 (+)) vs

reduce函数使用reducer函数组合序列中的元素。例如:

List.reduce (+) [1;2;4]

此处reduce使用1组合2+3提供3。然后44结合使用,结果为[3;2;1]

在OP示例中,我们也希望减少列表,但输入列表中的元素本身就是列表,因此reducer函数必须更复杂。

给定[4;3;5][7;5;6]的reducer函数将产生List.map2。这是分段加法。一种方法是使用map。通常map2使用映射器函数映射列表中的所有值。 List.map2 (+) [3;2;1] [4;3;5] 允许我们同时迭代两个输入,并将两个值映射为一个。

[7;5;6]

因此产生:int list list

上面的函数对let sum = List.reduce (List.map2 (+)) vs 的reducer函数有正确的签名,因此答案是:

{{1}}

答案 1 :(得分:1)

首先,我将假设您的列表列表实际上并不包含元组。所以问题应该是这样的: [[3;2;1]; [4;3;5]] should sum to [7;5;6]。如果您能够显示程序解决方案会很好,因为通常很容易转换为list comprehension。但请参阅下面的两种方法:

let xs = [[3;2;1]; [4;3;5]]

(xs.[0],xs.[1]) ||> List.map2 (+) // val it : int list = [7; 5; 6]

xs 
|> List.transpose
|> List.map List.sum //val it : int list = [7; 5; 6]