6

私はこのコードで何が起こっているのかを理解しようとしています。理解できないことがあるかどうか、またはコンパイラのバグや直感的でない仕様であるかどうかを理解しようとしています。これら2つのほぼ同じ関数を定義しましょう。

def typeErause1(a: Any) = a match {
    case x: List[String] => "stringlists"
    case _ => "uh?"
}
def typeErause2(a: Any) = a match {
    case List(_, _) => "2lists"
    case x: List[String] => "stringlists"
    case _ => "uh?"
}

今、私が電話すると、実際に型消去を使用しても違いがわからないため、typeErause1(List(2,5,6))取得します。しかし、不思議なことに、電話をかけると、以前のように一致しない理由がわかりません。代わりに2番目の関数を使用すると、正しく一致させることができるため、これはscalacのバグだと思います。"stringlists"List[Int]typeErause2(List(2,5,6))"uh?"List[String]List[_]

Scala2.9.1を使用しています

4

1 に答える 1

1

これはマッチャーのバグです ;) パターンマッチャーは2.10 用に書き直されています (されていますか?)。

最新のナイトリーで確認したところ、コードは期待どおりに機能します。

Welcome to Scala version 2.10.0-20120426-131046-b1aaf74775 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_31).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def typeErause1(a: Any) = a match {
     |     case x: List[String] => "stringlists"
     |     case _ => "uh?"
     | }
warning: there were 2 unchecked warnings; re-run with -unchecked for details
typeErause1: (a: Any)String

scala> def typeErause2(a: Any) = a match {
     |     case List(_, _) => "2lists"
     |     case x: List[String] => "stringlists"
     |     case _ => "uh?"
     | }
warning: there were 3 unchecked warnings; re-run with -unchecked for details
typeErause2: (a: Any)String

scala> typeErause1(List(2,5,6))
res0: String = stringlists

scala> typeErause2(List(2,5,6)) 
res1: String = stringlists
于 2012-04-27T21:09:22.483 に答える