4

apply()後に明示的な呼び出しが必要な理由を誰かが説明してもらえますかmap()

scala> val l = List(1, 2, 3)
l: List[Int] = List(1, 2, 3)

scala> l(2)
res56: Int = 3

scala> l.map(x => x*2)
res57: List[Int] = List(2, 4, 6)

scala> l.map(x => x*2)(2)
<console>:9: error: type mismatch;
 found   : Int(2)
 required: scala.collection.generic.CanBuildFrom[List[Int],Int,?]
              l.map(x => x*2)(2)
                              ^

scala> l.map(x => x*2).apply(2)
res59: Int = 6

ありがとう。

4

1 に答える 1

7

これは、mapメソッドが暗黙のパラメーターimplicitを持つ 2 番目の引数リストを取るためです。CanBuildFrom

def map[B, That](f: (A) ⇒ B)(implicit bf: CanBuildFrom[List[A], B, That]): That

2Scala コンパイラは、あたかも暗黙CanBuildFromが必要な場所を渡そうとしているようにコードを解釈します。

CanBuildFromそれに付随する醜いメソッド シグネチャの使用法は、Scala コレクション ライブラリの非常に物議を醸す要素であり、定期的に議論され、批判されています。

ここでのもう 1 つの問題は、Scala では暗黙的なパラメーターを明示的に渡すことができるという事実です。私は個人的に、それは許可されるべきではないと主張します.そうすれば、あなたのような多くの問題を避けることができます. しかし、それはもちろん意見の問題です。

于 2013-11-09T17:27:49.467 に答える