2

次のコードがあるとします。

object ForComprehension {
  def generateSomeSeq(n: Int): List[Int] = (1 to n).toList
  def square(n: Int): List[Int] =
    for (x <- generateSomeSeq(n)) yield x * x
}

それはすべてうまくいきます。しかし、何らかの理由で、最初のメソッドの結果を次のSet代わりに変更しListます。

object ForComprehension {
  def generateSomeSeq(n: Int): Set[Int] = (1 to n).toSet
  def square(n: Int): List[Int] =
    for (x <- generateSomeSeq(n)) yield x * x
}

Scalaコンパイラーは、理解のための最初のジェネレーターに型の不一致があると文句を言います。それは理にかなっていますが、どちらの場合でも機能することを期待しています。結局のところ、のList代わりにを期待していることを理解するための視覚的な手がかりはありませんSet。タイプの不一致エラーを診断するには、両方の署名を読み取る必要があります。

それとも、そもそも理解のためにそのような構文上の局所性を期待するべきではありませんか?

4

1 に答える 1

2

あなたの例の理解のためは、実際にはへの呼び出しのための単なる構文糖衣でmapあり、の戻り型mapは実際にそれが呼び出される型によって決定されます。より正確には、それCanBuildFromは利用可能な暗黙によって決定されます。したがって、コードをコンパイルするには、理解のためにマップ呼び出しに変換し、通常は暗黙的なパラメーターを明示的に渡すことができます。

object ForComprehension {
  def generateSomeSeq(n: Int): Set[Int] = (1 to n).toSet
  def square(n: Int): List[Int] = 
    generateSomeSeq(n).map(x => x * x)(scala.collection.breakOut)
}

仕組みについては、この質問breakOutを参照してください。

于 2012-10-24T15:44:45.763 に答える