gpt4 book ai didi

scala - 使用 Scala 折叠元组列表

转载 作者:行者123 更新时间:2023-12-04 17:00:01 25 4
gpt4 key购买 nike

这个简单的 Scala 代码有什么问题?

val l = List(("a", 1), ("b", 2), ("c", 3), ("d", 4), ("e", 5))
l.fold(0) {(acc: Int, tup: (String, Int)) => acc + tup._2}

:9: error: type mismatch; found : (Int, (String, Int)) => Int required: (Any, Any) => Any l.fold(0) {(acc: Int, tup: (String, Int)) => acc + tup._2}



在其他函数式语言(例如 f#)中,这有效:
let l = [("a", 1); ("b", 2); ("c", 3); ("d", 4)];;
List.fold(fun accm tup -> accm + (snd tup)) 0 l;;
val it : int = 10

最佳答案

fold方法假定一个关联运算符,并且理论上可以(例如在使用并行性时)以任意顺序执行。因此,签名清楚地表明累积类型必须是集合元素的父类(super class)型:

def fold[A1 >: A](z: A1)(op: (A1, A1) ⇒ A1): A1 
(String, Int)的推断父类(super class)型和 IntAny .

这在 API documentation 中都有描述。 .

您想要的是 foldLeftfoldRight对类型没有此限制:
def foldLeft[B](z: B)(f: (B, A) ⇒ B): B 

所以:
l.foldLeft(0) { (acc, tup) =>
acc + tup._2
}

或者
(0 /: l) { 
case (acc, (_, n)) => acc + n
}

关于scala - 使用 Scala 折叠元组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27576943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com