2012-07-16 16 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]Model eşleme dizisi anlamalarının deyimsel yolu nedir?

Bu MatchError when match receives an IndexedSeq but not a LinearSeq aynı sorundur.

Sorun şu ki, nasıl yapmalı? Her yerde .toList eklemek doğru görünmüyor. Ve her Seq'u (diğer sorunun cevabında açıklandığı gibi) idare eden kendi çıkarıcıyı yaratmak, herkesin yapacağı bir karışıklığa yol açacaktır ...

Sanırım soru, neyi etkileyemiyorum Sıralı anlamaların dönüş türü: veya neden standart kitaplığın genelleştirilmiş Seq çıkarıcı parçası değil? Örneğin

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

:

+5

Bu genelleştirilmiş çıkarıcı, 2.10: 'a val = +: b = 0 'dan 10' 'a kadarki gibi çalışır: val a :: b = (0'dan 10'a kadar) .toList' 2.9'da çalışır. –

+0

Hmm, çok ilginç! Her ne kadar listeler için iki ekstraktörü olan bir karışıklık yaratacağından emin değilim. Bu çıkarıcı daha sonra değiştirilecek mi? Sonuçta, aynı şeyi yapabilir ve daha geneldir. – letmaik

+1

@TravisBrown bilmek güzel. List 'Nil' de bir eşdeğer var mı? –

cevap

36

Eh, herhangi bir dizi kalıp eşleşebilir

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 

Daha sonra, bu (ya da eşittir) daha fazla olan herhangi bir dizisine uymaktadır 2 elemanları olacak

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

Ben scala.MatchError olsun: Vector (1, 2, 3) (sınıfın scala.collection.immutable.Vector) bununla. Sadece böyle vaka sınıflarıyla eşleştirmek mümkün değil mi? – letmaik

+0

Oops - üzgünüm - cevapsız bir '' '' '' –

+0

Bir extractor ile bir şeyle eşleştirmek mümkündür - bu durumda, bir 'unapplySeq' yöntemi ile bir şey. –

İlgili konular