4

空のマップがあるとしましょう
val map = Map[Int, Int]()

次のコードは正しくコンパイルされるため、混乱しています。

map.foldLeft((0,0)){case((k1, v1), (k2, v2)) => (-1, -1)}

次の一見正確なコード スニペットでは、コンパイル エラーが発生します。

map reduceLeft {case((k1, v1), (k2, v2)) => (-1, -1)}

エラーは次のとおりです。

scala> map reduceLeft {case((k1, v1), (k2, v2)) => (k1, v1)}
<console>:9: error: missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: (?, (Int, Int)) => ?
              map reduceLeft {case((k1, v1), (k2, v2)) => (k1, v1)}

これは大きな問題ではありませんが、これに対処する必要がないことは明らかです。どうすれば違うのか、何かアイデアはありますか?それとも、それを受け入れることを学ばなければなりませんか?

4

1 に答える 1

9

これが発生する理由は、foldLeft2つのパラメーターリスト(1つ目は初期の「プライミング」値、2つ目は関数)reduceLeftがあり、1つ(関数)しかないためです。

Scalaの型推論は、一度に1つのパラメーターリストを操作します。さらに、1つのパラメーターリストで推論された型は、特定のパラメーターリスト内で型推論をガイドまたは制約するのに役立たない方法で、後のタイプ(さらに右側)で型推論をガイドまたは制約するために使用できます。この場合、ScalaはreduceLeft署名のBタイプを正しく推測できません。

def reduceLeft[B >: (A, B)](op: (B, (A, B)) ⇒ B): B 

折りたたんだ場合:

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

プライマー値のみを調べることでタイプをBにバインドし((0, 0))、関数内のパラメータータイプを推測するために使用できます(明示的にする必要はありません)。

于 2013-02-08T01:04:38.533 に答える