9

リストからすべてを削除しようとしたときにUnit - ()、 を呼び出そうとしましたtoMap

scala> List((), ()).filter(_ != ()).toMap
<console>:8: error: Cannot prove that Unit <:< (T, U).
              List((), ()).filter(_ != ()).toMap
                                           ^

このエラーはどういう意味ですか?

の場合、非ユニット要素Listのすべてのタプルのマップを作成したいのですが、一部の値が null になる可能性があります。(String, String)

scala> val x = List((), (), (3,4)).filter(_ != ()).toMap
<console>:7: error: Cannot prove that Any <:< (T, U).
       val x = List((), (), (3,4)).filter(_ != ()).toMap
                                                   ^

scala> val x = List((), (), (3,4)).filter(_ != ())
x: List[Any] = List((3,4))

scala> x.toMap
<console>:9: error: Cannot prove that Any <:< (T, U).
              x.toMap
                ^
4

3 に答える 3

4

ああ!これで、他の質問がもう少し理にかなっています。Unitただし、この混合/Tuple2リストを作成するために何をしているのかはまだわかりません。

これはうまくいくはずです:

List((), (), (3,4)).collect { case t@(_: Int, _: Int) => t }.toMap

ここでは、新しいものを作成するのではなく、一致したものと同じ Tuple2 インスタンスを返すために、ここで変数バインディング(一致を にバインド)を使用していることに注意してください。t

を使用して、リストのタイプを からにcollect変換します。List[Any]List[(Int, Int)]toMapList[(A,B)]


注:この回答はうまくいくはずですが、それでもあなたの設計には欠陥があると思います。このような症状を治療するよりも、根本的な設計上の欠陥を修正したほうがよいでしょう。

これは、 Scala のOptiontypeを使用するのに適しているようです。この場合、サンプル リストは になるList(None, None, Some((3,4)))か、読みやすくするために記述できますList(None, None, Some(3->4))(このようにネストされた括弧は混乱を招く可能性があります)。

を使用するOptionと、リストのタイプは になりますList[Option[(Int, Int)]]。これは、 よりも扱いやすいはずList[Any]です。Noneエントリを削除して必要なものを取得するには、次のList[(Int,Int)]ように呼び出しますflatten

List(None, None, Some(3->4)).flatten
// res0: List[(Int, Int)] = List((3,4))
List(None, None, Some(3->4)).flatten.toMap
// res1: scala.collection.immutable.Map[Int,Int] = Map(3 -> 4)

ただし、最初からエントリをリストに入れることを避けることができれば、さらに良いでしょう。None理解のために Scala を使用してこのリストを作成している場合は、for 式でガードを使用して、出力から無効な要素を削除できます。

于 2013-10-10T18:21:11.403 に答える
2

これは、リスト内の要素の型を、Map の構築に必要なタプルとして表示できないことを意味します。ある意味でのマップは、タプル (およびそれ以上) のコレクションです。

図:

scala> List(1).toMap
<console>:8: error: Cannot prove that Int <:< (T, U).
          List(1).toMap
                  ^
scala> List(1 -> 2).toMap
res1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)

タプルのリストからマップを作成できますが、単一のカーディナリティ要素のリストからは作成できません。

.mapの代わりに言いたいのかもしれません.toMap。;)

于 2013-10-10T18:14:57.847 に答える
1

すべてを一度に:

scala> val l2 = List(1 -> 3, (), 4 -> 4, (), 9 -> 4, (), 16 -> 7)
l2: List[Any] = List((1,3), (), (4,4), (), (9,4), (), (16,7))

scala> (l2 collect { case (a, b) => (a, b) }).toMap
res4: scala.collection.immutable.Map[Any,Any] = Map(1 -> 3, 4 -> 4, 9 -> 4, 16 -> 7)

より良いタイプ:

scala> (l2 collect { case (i: Int, j: Int) => (i, j) }).toMap
res5: scala.collection.immutable.Map[Int,Int] = Map(1 -> 3, 4 -> 4, 9 -> 4, 16 -> 7)
于 2013-10-11T13:42:59.653 に答える