foldLeft на карте - почему это работает?
Это из курса 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
соответствует addTerm
которая имеет подпись ( Map[Int, Double], (Int, Double) ) => Map[Int, Double]
,
Для меня это не выглядит последовательным. Что я делаю неправильно?
1 ответ
Да, это проблема 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
скаладок просто подставляет тип 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