F# reduce 元组列表上的函数

标签 f# f#-interactive f#-3.0

这段简单的代码让我很困惑

这样就可以了

> let l = [1; 2; 3; 4];;
val l : int list = [1; 2; 3; 4]
> List.reduce(fun accm i -> accm + i) l;;
val it : int = 10

但这不是(即使逻辑完全一样)

> let l = [("a", 1); ("b", 2); ("c", 3); ("d", 4)];;                         
val l : (string * int) list = [("a", 1); ("b", 2); ("c", 3); ("d", 4)]       

> List.reduce(fun accm tup -> accm + (snd tup)) l;;                          
List.reduce(fun accm tup -> accm + (snd tup)) l;;        

>stdin(46,47): error FS0001: The type 'int' does not match the type 'string * int'

为什么会出现这个错误,因为代码很简单。遍历列表获取元组并将其与累加器的值一起传递给 reduce 函数。

在函数内部,从元组中取出第二个值并将其添加到累加器中。

我知道可能有很多其他方法可以获得我想要的东西......但我想知道为什么上面的代码不起作用?

最佳答案

您需要提供一个初始值。如果没有初始值,则 reduce 假定 List 中的第一个值是初始值,它是一个元组。因此你得到的错误。

关于F# reduce 元组列表上的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27576861/

相关文章:

f# - Deedle 数据框中的 pretty-print

f# - F# 3.0 运行时是否可再发行?

entity-framework - Entity Framework 的类型提供程序

F# 查询加入/组/聚合?

f# - 了解 F# seq

xml - F# XML 数据解析 '' 子类型''

asynchronous - 从 C# 调用非异步 Func<T> 返回 F# 函数中的启动 Async<T>?

F# 类型提供程序在引用项目中查找示例文件,而不是引用项目

random - 如何使用F#从列表中选择一个随机值

f# - 如何在 fsi 和 fsharp 脚本中请求 UAC