【问题标题】:F# reduce function on List of Tuples元组列表上的 F# reduce 函数
【发布时间】:2014-12-20 04:15:26
【问题描述】:

这段简单的代码难倒我

所以这行得通

> 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 函数。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    reduce 的参数应该具有彼此相同的类型和列表的元素(在本例中为元组类型),但您正试图将一个添加到另一个的后半部分。

    【讨论】:

      【解决方案3】:

      我认为你想要做的是List.sumBy snd

      reduce 假设累加器与列表项的类型相同,这不是问题中的 reducer 函数所做的假设。

      【讨论】:

        猜你喜欢
        • 2013-11-14
        • 2019-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多