2016-07-06 9 views

答えて

4

2番目のファイルがコンパイルされる理由はわかりませんが、うまくいきません。あなたは、パターンシーケンスを一致させたい場合は

scala> IndexedSeq(1,2, 3).toSeq match { 
    case a :: b :: c :: nil => println("toto"); 
} 
    |  | scala.MatchError: Vector(1, 2, 3) (of class scala.collection.immutable.Vector) 

、あなたはどちらかは、+を使用する必要があります:参加事業者として、(a、b、c)は、パターンが一致するよう配列を使用しますか。必要に応じてthis answer

は、すべての作業を、以下を参照してください。

IndexedSeq(1,2, 3).toSeq match { 
    case Seq(a, b, c) => println("toto"); 
} 

IndexedSeq(1,2, 3) match { 
    case Seq(a, b, c) => println("toto"); 
} 

IndexedSeq(1,2, 3).toSeq match { 
    case a +: b +: c => println("toto"); 
} 

IndexedSeq(1,2, 3) match { 
    case a +: b +: c => println("toto"); 
} 
1

@ladamsの答えに追加するには。 IndexedSeqでtoSeqを呼び出すのは、後者が前者から継承するので、superを参照するだけです。サイドノートでは、あなたはまた、値に以下の方法を抽出できます。

IndexedSeq(1, 2, 3) match { 
    case IndexedSeq(head, tail @ _*) => println("got match") 
    case _ => println("sth else") 
    } 

をまた、配列は、例えば、適切なコレクションを返すだけの特徴です

val s: Seq[Int] = 1 :: 2 :: 3 :: Nil 
s: Seq[Int] = List(1, 2, 3) 

したがって、Consと一致させることができます。 IndexedSeqはVectorを返しますが、Cons演算子は定義しません。パターンa :: b :: cのタイプはList[something]あり、セレクタIndexedSeq(1, 2, 3)のタイプはIndexedSeq[Int]あるため

val s: IndexedSeq[Int] = IndexedSeq(1, 2, 3) 
s: IndexedSequence[Int] = Vector(1, 2, 3) 
+0

* Seqは、適切なコレクションを返すだけの特性です。*「形質」は、「Cons」にマッチすることができますか? 'IndexedSeq [A]'も 'trait'です。 –

+0

それは特性ではありませんが、Seq(1,2,3)を呼び出すとConsを実装するList(1,2,3)が返されるという事実です。 – sebszyller

+0

しかし、 'IndexedSeq(1,2,3).toSeq'は' Vector [Int] 'を返します。 –

1

最初の例では、コンパイルされません。 ListIndexedSeqのサブタイプではないため、一致が成功する可能性がなく、エラーが発生することをコンパイラは認識しています。 the language specificationに記載されているように(式を削除するために少し言い換えて):

すべてのパターンは2通りの方法で入力できます。まず、セレクタの型を期待する型としてパターンを入力しようとします。これに失敗した場合は、型パラメータのすべてのオカレンスをundefinedに置き換えることによって、予期される変更された型が代わりに型付けされます。この第2ステップも失敗すると、コンパイル時エラーが発生します。第2のケースで

、セレクタの種類はこれまでコンパイラに関しては、それそれが成功するであろう場合には、実行時にList[Int]、であることが判明する可能性があり、Seq[Int]あります。それはマッチが失敗する可能性があるという警告を出す可能性がありますが(実際はそうですが)、Scalaのデザイナーは別途決めました。そのような警告はセレクタのタイプがsealedの場合にのみ与えられます。

関連する問題