2012-04-10 11 views
1

誰かが次のようなことを回避する最良の方法を説明できますか? 不思議なタイプのエラーです。私はそうのようなタプルのリストを作成するとします。スカラーマップ/タイプのインスタンス化

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

を今、私はリスト(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) 

しかし、この設定では分かりにくいと感じます。ありがとう!

答えて

7

試してみてください。

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

か:

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

何が起こっているのでmapがタプルであることを起こる、単一の引数、から関数を期待し、ys(Int,Int)Listであるということである(Int,Int) 、何かに(技術的には、mapは、引数がFunction1[(Int,Int),Int]と期待しています。(a: Int, b: Int) => a+b i実際には単一の引数からの関数ではない(Int, Int)からInt;代わりに、Int(a Function2[Int,Int,Int])への2つの引数(両方ともInt)の関数です。

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! 

答えの上部に私の提案を説明するために::Scalaは区別されますので、違いは微妙な、しかし重要である最初の例では、使用するmapに与えられた関数の定義を変更したcaseこれはScalaに単一の(Int,Int)引数をその2つの部分に解凍するように指示します。 2番目の例では、1つのタプル引数(p)の関数があり、タプルの各部分を手動で抽出します。

最後に、タイプ注釈も必要ないことに注意してください。これらの作業だけでも:

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

ys.map(p => p._1 + p._2) 
+0

ボーナスポイントを追加すると、それらのInt型の帰属が削除されます! –

+0

@Adam、あなたはそれを私に打ち明けました:-) – dhg

+0

"case"ステートメントを使った解決策は、マップの引数として部分関数を提供しているので、すぐにペアを解除することができます。そして、正規関数の代わりに部分関数を提供できる理由は、部分関数が関数を拡張しているためです。 – jwinder

0

試み:

   ヴァルYS =一覧((1,2)、(3,4)、(5,6))
    YSマップ(t => t._1 + t._2)

関連する問題