foldLeft on Map - 为什么这样行得通?
foldLeft on Map - Why does that work?
这是来自 Coursera 的课程,直到现在还没有人能帮助我。
以下作品,摘自一次讲座
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)
}
考虑到foldLeft
在Map
中的签名如下,
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 related to Scaladoc, which seems to be fixed in Scala 2.12-RC1. You can check nightly Scala 2.12.x API 文档的问题,它显示了正确的签名。
解释:
TraversableOnce中定义的foldLeft
的签名是
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[K, V]
,则 foldLeft
将变为:
def foldLeft[B](z: B)(op: (B, (K, V)) ⇒ B): B
这是来自 Coursera 的课程,直到现在还没有人能帮助我。 以下作品,摘自一次讲座
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)
}
考虑到foldLeft
在Map
中的签名如下,
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 related to Scaladoc, which seems to be fixed in Scala 2.12-RC1. You can check nightly Scala 2.12.x API 文档的问题,它显示了正确的签名。
解释:
TraversableOnce中定义的foldLeft
的签名是
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[K, V]
,则 foldLeft
将变为:
def foldLeft[B](z: B)(op: (B, (K, V)) ⇒ B): B