2012-07-16 18 views
18
val x = for(i <- 1 to 3) yield i 
x match { 
    case 1 :: rest => ... // compile error 
} 

constructor cannot be instantiated to expected type; found : collection.immutable.::[B] required: scala.collection.immutable.IndexedSeq[Int]Cách thành ngữ để mô hình hóa sự khớp chuỗi là gì?

Đây cũng là vấn đề tương tự như MatchError when match receives an IndexedSeq but not a LinearSeq.

Câu hỏi đặt ra là, làm cách nào để thực hiện đúng? Thêm .toList ở mọi nơi có vẻ không đúng. Và tạo ra một bộ tách riêng xử lý mọi Seq (như được mô tả trong câu trả lời của câu hỏi khác) sẽ dẫn đến một mớ hỗn độn nếu mọi người ...

Tôi đoán câu hỏi là, tại sao tôi không thể ảnh hưởng đến những gì kiểu trả về của sự hiểu biết chuỗi là, hoặc: tại sao không phải là một phần trích xuất chung của thư viện chuẩn là một phần tổng hợp Seq?

+5

Bộ giải nén tổng quát này có sẵn trong 2,10: 'val a +: b = 0 cho đến 10' hoạt động như' val a :: b = (0 đến 10) .toList' thực hiện trong 2.9. –

+0

Hmm, rất thú vị! Mặc dù tôi không chắc chắn nếu nó cũng sẽ tạo ra một chút lộn xộn có hai vắt cho danh sách. Là vắt này sau đó nghĩa vụ phải thay thế ::? Sau khi tất cả, nó có thể làm điều tương tự và là chung chung hơn. – letmaik

+1

@TravisBrown thật hữu ích. Có tương đương với Nil' của List không? –

Trả lời

36

Vâng, bạn có thể mô-phù hợp với bất kỳ chuỗi:

case Seq(a, b, rest @ _ *) => 

Ví dụ:

scala> def mtch(s: Seq[Int]) = s match { 
    |  case Seq(a, b, rest @ _ *) => println("Found " + a + " and " + b) 
    |  case _ => println("Bah") 
    | } 
mtch: (s: Seq[Int])Unit 

Sau đó, điều này sẽ phù hợp với bất kỳ chuỗi với hơn (hoặc bằng) 2 yếu tố

scala> mtch(List(1, 2, 3, 4)) 
Found 1 and 2 

scala> mtch(Seq(1, 2, 3)) 
Found 1 and 2 

scala> mtch(Vector(1, 2)) 
Found 1 and 2 

scala> mtch(Vector(1)) 
Bah 
+0

Tôi nhận được scala.MatchError: Vector (1, 2, 3) (của lớp scala.collection.immutable.Vector) với điều đó. Không phải là nó có thể chỉ phù hợp với các trường hợp như vậy sao? – letmaik

+0

Rất tiếc - xin lỗi - đã bỏ lỡ một '*' –

+0

Có thể khớp bất kỳ thứ gì với bộ giải nén - trong trường hợp này, bất kỳ thứ gì có phương thức 'unapplySeq'. –