27

map()ペアのリストを呼び出したいのですが、型の不一致エラーが発生します。

たとえば、Int のペアの List をそれらの合計のリストにマップするとします。

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

scala> ll.map((x:Int,y:Int)=>x+y)
<console>:9: error: type mismatch;
 found   : (Int, Int) => Int
 required: ((Int, Int)) => ?
              ll.map((x:Int,y:Int)=>x+y)
                                  ^

ところで、 foreach() を実行しようとすると、非常によく似たエラーが発生します。

scala> ll.foreach((x:Int,y:Int)=>println(x,y))
<console>:9: error: type mismatch;
 found   : (Int, Int) => Unit
 required: ((Int, Int)) => ?
              ll.foreach((x:Int,y:Int)=>println(x,y))
                                  ^

?記号は何を表していますか。ここで何が欠けていますか?

4

4 に答える 4

47

パターン マッチングを使用して、ペアの要素を取得できます。

ll.map{ case (x:Int,y:Int) => x + y }

タイプを指定する必要さえありません。

ll.map{ case (x, y) => x + y }

foreachもちろん同じように動作します。

エラー メッセージは、コンパイラが任意の型 (疑問符) に対して1 つのパラメーター (int のペア)の関数を見つけることを期待していたのに、代わりに2 つのパラメーター (両方とも int) の関数を見つけたことを示しています。

于 2012-10-16T11:56:42.210 に答える
20

以下を使用できます。

ll.map(x => x._1 + x._2)

xタプル自体を表す場所、または

ll.map(x:(Int,Int) => x._1 + x._2)

型を明示的に宣言したい場合。

于 2012-10-16T11:56:33.333 に答える
7

関数をタプルできます。これは、N 個の引数を取るものから、N 個のタプルである 1 個の引数を取るものに移行することを意味します。これを行うための高階関数は、Functionオブジェクトで利用できます。これにより、優れた構文に加えて、Brian Agnew の回答へのコメントで強調されている追加の型安全性が得られます。

import Function.tupled

ll map tupled(_ + _)
于 2012-10-16T15:45:18.850 に答える