我想分别对列表列表中的每个第n个元素求和。即。
[[3;2;1]; [4;3;5]] should sum to [7;5;6]
所有嵌套列表都具有相同的长度,但此长度未知。在示例中它是3,但可能是4,5或6.我知道如何在程序上执行它但我需要在F#中使用功能解决方案。感谢
答案 0 :(得分:2)
计算总和的一种方法是:
let sum = List.reduce (List.map2 (+)) vs
reduce
函数使用reducer函数组合序列中的元素。例如:
List.reduce (+) [1;2;4]
此处reduce
使用1
组合2
和+
,3
提供3
。然后4
与4
结合使用,结果为[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]