gpt4 book ai didi

scala - foldLeft on Map - 为什么这样行得通?

转载 作者:行者123 更新时间:2023-12-01 11:24:43 29 4
gpt4 key购买 nike

这是来自 Coursera 的类(class),直到现在还没有人能帮助我。以下作品,摘自一次讲座。

object polynomials {

class Poly(terms0: Map[Int, Double]) {

def this(bindings: (Int, Double)*) = this(bindings.toMap)

val terms = terms0 withDefaultValue 0.0

def +(other: Poly) = new Poly((other.terms foldLeft terms)(addTerm))

def addTerm(terms: Map[Int, Double], term: (Int, Double)) : Map[Int, Double]= {
val (exp, coeff) = term
terms + (exp -> (coeff + terms(exp)))
}

override def toString =
(for ((exp, coeff) <- terms.toList.sorted.reverse)
yield coeff+"x^"+exp) mkString " + "
}

val p1 = new Poly(1 -> 2.0, 3 -> 4.0, 5 -> 6.2)
val p2 = new Poly(0 -> 3.0, 3 -> 7.0)
p1 + p2

p1.terms(7)

}

考虑到MapfoldLeft的签名如下,

def foldLeft[B](z: B)(op: (B, (A, B)) => B): B

我尝试理解签名并将其映射到上面示例中的用法。

零元素 z 对应于 terms 因此类型为 Map[Int, Double]
运算符 op 对应于具有签名 ( Map[Int, Double], (Int, Double) ) => Map[Int, Double]< 的 addTerm/.

对我来说,这看起来并不一致。我做错了什么?

最佳答案

是的,这就是问题 SI-6974与 Scaladoc 相关,似乎已在 Scala 2.12-RC1 中修复。你可以每晚查看Scala 2.12.x API文档,它显示正确的签名。

说明:

foldLeft的签名在 TraversableOnce 中定义是

def foldLeft[B](z: B)(op: (B, A) ⇒ B): B

哪里A是一种集合,来自Traversable[A] .

Map[A, B] <: Traversable[(A, B)] , 然后在 foldLeft 的定义中scaladoc 只是替换类型 A收集 (A, B) ,这带来了困惑:

def foldLeft[B](z: B)(op: (B, (A, B)) ⇒ B): B

如果您将 map 的参数重命名为 Map[K, V] , 然后 foldLeft变成:

 def foldLeft[B](z: B)(op: (B, (K, V)) ⇒ B): B

关于scala - foldLeft on Map - 为什么这样行得通?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38549366/

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