2012-07-16 12 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]पैटर्न मिलान अनुक्रम समझ के लिए बेवकूफ तरीका क्या है?

यह MatchError when match receives an IndexedSeq but not a LinearSeq रूप में एक ही समस्या है।

सवाल यह है कि, यह सही कैसे करें? .toList जोड़ना हर जगह सही नहीं लगता है। और एक स्वयं निकालने वाला जो प्रत्येक Seq (जैसा कि दूसरे प्रश्न के उत्तर में वर्णित है) को एक गड़बड़ी का कारण बनता है अगर हर कोई ऐसा करेगा ...

मुझे लगता है कि सवाल यह है कि मैं इसका प्रभाव क्यों नहीं डाल सकता अनुक्रम समझ की वापसी प्रकार है, या: मानक पुस्तकालय के ऐसे सामान्यीकृत Seq निकालने वाला हिस्सा क्यों नहीं है?

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

उदाहरण के लिए::

+5

यह सामान्यीकृत निकालने 2.10 में उपलब्ध है: 'वैल ए +: बी = 0 तक 10 'काम करता है जैसे' वैल ए :: बी = (0 तक 10) .toList' 2.9 में करता है। –

+0

हम्म, बहुत रोचक! हालांकि मुझे यकीन नहीं है कि क्या यह सूचियों के लिए दो निकालने वाले गड़बड़ी का थोड़ा सा भी निर्माण करेगा। क्या यह निकालने वाला तब बदलना चाहता है ::? आखिरकार, यह वही काम कर सकता है और अधिक सामान्य है। – letmaik

+1

@TravisBrown जो जानना अच्छा है। क्या सूची की 'शून्य' के बराबर भी है? –

उत्तर

36

ठीक है, आप किसी भी क्रम पैटर्न मिलान कर सकते हैं

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 

फिर इस किसी भी क्रम की तुलना में अधिक के साथ (या बराबर) से मेल खाएगी 2 तत्वों

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

मुझे स्कैला मिलता है। मैच त्रुटि: वेक्टर (1, 2, 3) (वर्ग scala.collection.immutable.Vector के साथ)। क्या इस तरह के केस वर्गों से मेल खाना संभव नहीं है? – letmaik

+0

ओह - क्षमा करें - एक '*' –

+0

चूक गया है निकालने वाले के साथ कुछ भी मिलान करना संभव है - इस मामले में, 'अनुपयोगी' विधि के साथ कुछ भी। –

संबंधित मुद्दे