2011-02-10 1 views
4

Map[String, Any] 고려 :이해를위한 두 패턴 일치 사이의 행동에 차이점이있는 이유는 무엇입니까?

scala> for ((a, b) <- m1) println(a + b) 
k1v1 
k210 

지금까지 너무 좋은 :

val m1 = Map(("k1" -> "v1"), ("k2" -> 10)) 

지금의이 for 쓰기 수 있습니다.

이제 두 번째 멤버의 유형을 지정할 수 있습니다 :

scala> for ((a, b: String) <- m1) println(a + b) 
k1v1 

scala> for ((a, b: Integer) <- m1) println(a + b) 
k210 

을 여기에, 나는 유형을 지정으로, 필터링은 큰 인 일어난다.

다음
val l1 = Array("a", 2) 

상황이 휴식 :

scala> for (v: String <- l1) println(v) 
<console>:7: error: type mismatch; 
found : (String) => Unit 
required: (Any) => ? 

내 두 질문은 :

  • 왜 아무튼 '

    는 이제 배열 [모든] 대신 사용하고 싶은 말은 두 번째 일치 필터도 마찬가지입니까?

  • 더러운 isInstanceOf을 사용하지 않고 두 번째 시나리오에서 이러한 필터링을 표현할 수있는 방법이 있습니까?

답변

12

글쎄, 후자의 예는 명시되지 않았기 때문에 작동하지 않습니다. 합리적인 행동이 무엇인지에 대한 논의가 있습니다. 개인적으로, 나는 당신과 똑같이 작동 할 것으로 기대합니다. 당신이 납득되지 않으면 club에 가입

val v: String = (10: Any) // is a compile error 
(10: Any) match { 
    case v: String => 
} // throws an exception 

: 문제는 점이다.

for (va @ (v: String) <- l1) println(v) 
+0

지금 당장 혼란 스럽기 때문에이 클럽에 가입하고 싶습니다! Scala 티켓이 있나요? 해결 방법은 훌륭하게 작동합니다. – ebruchez

+0

@ebruchez 사실, 그렇습니다. 오래된 것, 그리고 D.R. 맥 이버. 나는 대답으로 그것을 링크 할 것이다. –

+0

-1 인수 형 –

9

speced 행동의 주된 이유는 우리가 명확성을 위해 입력 한 주석을 추가 할 사람들을 격려 할 것입니다 : 여기 :-) 것은 해결 방법입니다. 이해를 돕기 위해 잠재적으로 매우 비용이 많이 드는 필터 작업을 얻는다면 이는 피할 수있는 함정입니다. 그러나 나는 무엇인가가 패턴이라는 것을 더 쉽게 지정해야한다는 것에 동의한다. 아마도 한 쌍의 괄호만으로 충분할 것입니다.

val x: String = y  // type check, can fail at compile time 
val (x: String) = y  // pattern match, can fail at run time 

for (x: String <- ys) // type check, can fail at compile time 
for ((x: String) <- ys) // pattern match, can filter at run time 
+0

그 구문은 의미가 있습니다. 스칼라 2.9를위한 것? – ebruchez

+2

그 구문은 꽤 미묘합니다. 왜 패턴 매칭 폼을 구별하기 위해'case'를 사용하지 않을까요? –

+0

전 합리화를 보지 못했습니다. +1! 모든 사람들은 괄호 추가가 런타임 패널티를 추가한다는 것을 알고 있습니다. 그것은 리스프입니다. –