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
Другие вопросы по тегам