1

誰かが次のかなり奇妙な型エラーを回避する最良の方法を説明できますか? 次のようなタプルのリストを作成するとします。

scala> val ys = List((1,2), (3,4), (5,6))
ys: List[(Int, Int)] = List((1,2), (3,4), (5,6))

さて、これを List(Int) にマップしたい場合

scala> ys.map((a: Int, b: Int) => a + b)
<console>:9: error: type mismatch;
found   : (Int, Int) => Int
required: ((Int, Int)) => ?
   ys.map((a: Int, b: Int) => a + b)
                           ^

手がかりはありますか?理解のために を使用できることを知っています

scala> for ((a, b) <- ys) yield a + b
res1: List[Int] = List(3, 7, 11)

しかし、この設定で理解を打ち砕くのは間違っていると感じます. ありがとう!

4

2 に答える 2

7

試す:

ys.map { case (a: Int, b: Int) => a + b }

また:

ys.map(p: (Int, Int) => p._1 + p._2)

何が起こっているかというと、それysは のList(Int,Int)あるためmap、たまたま tuple である単一の引数から別の(Int,Int)何かへの関数を期待しています (技術的にmapは、 の引数を期待していますFunction1[(Int,Int),Int]。関数(a: Int, b: Int) => a+bは実際には単一の引数(Int, Int)から への関数ではなくInt、代わりに両方Intの s から an Int(a ) への2 つの引数の関数Function2[Int,Int,Int]. 違いは微妙ですが、Scala が区別するので重要です:

val f: Function1[(Int,Int),Int] = (p: (Int,Int)) => p._1 + p._2
ys.map(f) // fine

val g: Function1[(Int,Int),Int] = { case (a: Int, b: Int) => a + b }
ys.map(g) // fine, technically a PartialFunction[(Int,Int),Int]

val h: Function2[Int,Int,Int] = (a: Int, b: Int) => a + b
ys.map(h) // ERROR!

map答えの一番上にある私の提案を説明するには: 最初の例では、 usecaseに与えられた関数の定義を変更しました(Int,Int)。(括弧の代わりに中括弧を使用していることにも注意してください。) 2 番目の例では、単一のタプル引数 の関数がありp、タプルの各部分を手動で抽出します。

最後に、型注釈も必要ないことに注意してください。これらも同様に機能します。

ys.map { case (a,b) => a + b }

ys.map(p => p._1 + p._2)
于 2012-04-10T02:46:24.337 に答える
0

試す:

  val ys = List((1,2),(3,4),(5,6))
  ys マップ (t => t._1 + t._2)

于 2012-04-10T12:30:34.010 に答える