【问题标题】:Summing items on a nested list f#对嵌套列表中的项目求和 f#
【发布时间】:2018-10-02 09:32:45
【问题描述】:

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

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

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

【问题讨论】:

  • 在您的列表列表中,您有一个元组吗?还是清单?我想你的意思是:[[3;2;1]; [4;3;5]] should sum to [7;5;6]。注意分号。您写的内容类型为(int * int * int) list list,但您可能想要int int list
  • 是的,现在正确吗?抱歉,我是 F# 新手
  • 是的。 F# 使用; 来分隔数组和列表元素。您应该阅读fsharpforfunandprofit.com 中的一些介绍系列
  • 是的,我一直在阅读。你知道解决这个问题的方法吗,我需要转置它是否像一个矩阵并求和?
  • 你已经有两个答案了 :-) 你可以使用List.transpose 或者你可以使用List.reduce。列表理解类型的解决方案由您决定。

标签: list recursion f# functional-programming


【解决方案1】:

计算总和的一种方法是:

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

reduce 函数使用 reducer 函数将元素组合成一个序列。例如:

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

这里reduce 结合12 使用+ 得到3。然后34 结合得到4

在 OP 示例中,我们也喜欢对列表进行归约,但输入列表中的元素本身就是列表,因此归约函数必须更复杂一些。

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

List.map2 (+) [3;2;1] [4;3;5]

因此产生:[7;5;6]

上面的函数对于 int list list 的 reducer 函数有正确的签名,因此答案是:

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

【讨论】:

  • 谢谢!从一场可怕的悲剧中拯救了我的任务:)
【解决方案2】:

首先,我将假设您的列表列表实际上不包含内部元组。所以这个问题应该这样表述: [[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]

【讨论】:

  • 我可能指的是 C# 中的命令式解决方案
  • F# 中的 List.transpose ?
  • 嗯,你可以展示C#代码,它可以被翻译。是的,List.transposeF#中,最近被添加了。
猜你喜欢
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
相关资源
最近更新 更多