20

List(1、 "1")があり、List [Any]と入力されていると仮定します。これはもちろん正しく、期待されています。今、私がこのようにリストをマップすると

scala> List(1, "1") map {
     |   case x: Int => x
     |   case y: String => y.toInt
     | }

結果の型はList[Int]であり、これも期待されます。次の例ではList[Any]になるため、私の質問は、フィルターのマップに相当するものがあるかどうかです。これは可能ですか?これはコンパイル時に解決でき、実行時には解決できないと思いますか?

scala> List(1, "1") filter {
     |   case x: Int => true
     |   case _ => false
     | }
4

3 に答える 3

24

Scala 2.9:

scala> List(1, "1") collect {
     |   case x: Int => x
     | }
res0: List[Int] = List(1)
于 2010-02-07T22:14:52.380 に答える
6

なぜ最も投票された答えがうまくいかないのか疑問に思っているこの質問に出くわした人は、Scala2.8の最終リリースの前にpartialMapメソッドの名前が変更されていることに注意してください。collect代わりにこれを試してください:

scala> List(1, "1") collect {
     |   case x: Int => x
     | }
res0: List[Int] = List(1)

(これは、Daniel C. Sobralのすばらしい答えに対するコメントであるはずですが、新しいユーザーとして、私はまだコメントすることを許可されていません。)

于 2011-02-11T21:38:17.577 に答える
1

変更された質問に関して、partialFunctionを構成するケースで単にガードを使用すると、次のフィルタリングが行われます。

scala> val l1 = List(1, 2, "three", 4, 5, true, 6)
l1: List[Any] = List(1, 2, three, 4, 5, true, 6)

scala> l1.partialMap { case i: Int if i % 2 == 0 => i }
res0: List[Int] = List(2, 4, 6)
于 2010-02-08T20:03:01.887 に答える