如何在F#中汇总多个列表

时间:2013-10-11 14:32:31

标签: list f# aggregate

在F#中,我有很多列表(它们的实际数量因输入数据而不同),我想对所有这些列表进行聚合(假设为了简化而添加)。所以我想要达到的目标与List.map2或List.map3相同,但是对于更多的列表。

我该如何处理?我想知道这是否可以与List.scan一起使用?

1 个答案:

答案 0 :(得分:9)

您可以使用List.reduce并执行以下操作:

> let lists = [[1;2;3]; [1;2;3]; [1;2;3]]
val lists : int list list = (...)

> lists |> List.reduce (List.map2 (+));;
val it : int list = [3; 6; 9]

这是做什么的?

  • List.reduce获取值列表(此处值为int list),并使用说明如何合并两个值的函数将它们聚合为单个值。所以在这种情况下,我们需要给它一个函数int list -> int list -> int list,它将在第一个和第二个列表上调用它,然后在结果和第三个列表上调用它(依此类推)。

  • 参数List.map2 (+)是正确类型的函数 - 它需要两个列表并执行两个列表的成对求和。这实际上只是写下这样的东西的捷径:

    lists |> List.reduce (fun list1 list2 -> 
      List.map2 (fun a b -> a + b) list1 list2)