这段简单的代码让我很困惑
这样就可以了
> 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/