3

これは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)

}

foldLeftinの署名が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]

私には、これは一貫していないように見えます。私は何を間違っていますか?

4

1 に答える 1

5

はい、これはScaladoc に関連するSI-6974の問題で、Scala 2.12-RC1 で修正されたようです。ナイトリーScala 2.12.x API ドキュメントを確認すると、正しい署名が示されています。

説明:

TraversableOncefoldLeftで定義されている署名は

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

whereAはコレクションのタイプであり、 から来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
于 2016-07-24T07:51:14.250 に答える