2012-07-16 6 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을 처리하는 자체 추출기를 만들면 (다른 질문의 답에 설명 된대로) 모두가 그럴 경우 혼란을 겪을 수 있습니다 ...

질문에 대한 답은 무엇입니까? sequence comprehensions의 리턴 타입은 다음과 같다 : Seq 추출기가 표준 라이브러리의 일부분 인 이유는 무엇인가? 예를 들어

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

:

+5

이 일반화 된 추출기는 2.10에서 사용할 수 있습니다. 'val a + : b = 0 ~ 10'은 'val a :: b = (0에서 10까지) .toList'가 2.9 에서처럼 작동합니다. –

+0

흠, 매우 흥미 롭습니다! 목록 작성을 위해 두 개의 추출기를 사용하여 약간의 엉망이 생기는지 확실하지 않지만. 이 추출기가 다음을 대체 할 예정입니까 ::? 결국, 그것은 똑같은 일을 할 수 있고 더 일반적입니다. – letmaik

+1

알아두면 좋은 @TravisBrown. List의 'Nil'과 같은 것이 있습니까? –

답변

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 

그런 다음이 (또는 동일)보다 더 어떤 순서와 일치하는 두 요소가됩니다

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

scala.MatchError : (scala.collection.immutable.Vector 클래스의) 벡터 (1, 2, 3). 그런 경우에만 클래스를 일치시키는 것이 가능하지 않습니까? – letmaik

+0

죄송합니다. '*'가 누락되었습니다 –

+0

추출기와 어떤 것도 일치시킬 수 있습니다.이 경우에는 'unapplySeq' 메소드가있는 것이 전부입니다. –