1

Scala 2.9.3 で (k,v) タプルのネストされたリストを (v,k) のフラット リストに変換したい。必要な関数リテラルを flatMap に入れてみました。しかし、これは起こります:

scala> List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) ).flatMap{ case (k,v) => (v,k) }
<console>:16: error: constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: List[(Int, java.lang.String)]
       List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) ).flatMap{ case (k,v) => (v,k) }
                                                                              ^
<console>:16: error: not found: value v
       List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) ).flatMap{ case (k,v) => (v,k) }
                                                                                        ^
<console>:16: error: not found: value k
       List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) ).flatMap{ case (k,v) => (v,k) }
                                                                                      ^

なぜこれが私に起こっているのですか?

4

2 に答える 2

3

ここでは ではなくflattenandを使用する必要があります。mapflatMap

flatMaponList[a]は関数A => List[B](実際にはList[B]ではなく、 の任意のコレクションB) を取り、 を返しますList[B]。これはあなたの場合ではありません。

あなたには機能がありますが、機能C => BはありませんList[C] => List[B]。あなたの場合AList[C].

maponList[A]は関数A => Bを受け取り、 を返しますList[B]

val listOfLists = List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) )
listOfLists.flatten.map{ case (k,v) => (v,k) }
// List[(String, Int)] = List((123,1), (abc,1), (qwer,45))

を使用できますが、次のような引数として受け取る関数を提供する必要flatMapがあるためです。List[List[A]]List[A]

listOfLists.flatMap( _.map{case (k,v) => (v,k)} )
// List[(String, Int)] = List((123,1), (abc,1), (qwer,45))
于 2013-06-28T07:14:19.323 に答える
1

これはうまくいきます:

scala> val m =  List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) )
m: List[List[(Int, java.lang.String)]] = List(List((1,123), (1,abc)), List((45,qwer)))

scala> m.flatten.map { case (k,v) => (v,k) }
res0: List[(java.lang.String, Int)] = List((123,1), (abc,1), (qwer,45))

基本的に、最初にネストされたリストをフラット化し、次にマップしてタプルを並べ替えます。

于 2013-06-28T07:18:12.223 に答える