2013-05-04 1 views
7

패턴 일치 구문을 체인화 할 수없는 이유는 무엇입니까? 예를 들어, 다음은,패턴 일치 "return"값

val a = ADT(5) 

val b = a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
} 
b match { 
    case ADT(a) if a > 13 => doSomething(a) 
    case _ => {} 
} 

무의미한 경우, 법적으로 허용되지만 다음은되지 않습니다 :

a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
} match { 
    case ADT(a) if a > 13 => doSomething(a) 
    case _ => {} 
} 

은 내가 처음부터 그 일을하지 말아야하기 때문에 그것의 생각하지만, 원칙적으로 왜 합법적이지 않은지 나는 알지 못합니다.

+4

'(일치 {..}) 일치 {...}'작동합니다. – user2246674

답변

5

그렇습니다. Scala의 (거의) 모든 것이 표현식이고 모든 표현식을 패턴 일치로 사용할 수 있기 때문에 작동합니다.

이 경우 패턴 일치는 표현식이므로 다른 "연결"패턴 일치에서 사용할 수 있습니다. 그러나 컴파일러는 그것을 좋아하지 않습니다. 컴파일러에게 괄호 약간의 힌트를주기

도움 :

case class ADT(value: Int) 

val a = ADT(5) 

(a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
}) match { 
    case ADT(a) if a > 13 => println(a) 
    case _ => {} 
} 
+0

나도 괄호 해결 방법을 발견했지만, 왜 여기에 필요한 이유는 모르지만 'val a = if (false) 6 else if (true) if (true) 5 else 3 else 2' –

+0

@CarlSummers 컴파일러는 그저 그렇게 많이 추론 할 수 있습니다. 그것은 단지 운영 명령입니다. 의심 스러울 때 (당신, 또는 컴파일러) 명백하게됩니다. (저는 실제로 스칼라를 처음 접했지만 이것도 제가 좋아하는 것들 중 하나입니다.) – hangtwenty

3

직감이 정확합니다. — 보통 은 중괄호없이 같은 삽입 연산자를 연결할 수 있습니다 (다른 사용자가 제안한대로). 실제로 match은 — 메서드로 구현되었으며 대체 구문이 작동했을 수 있도록 중위 연산자 (기본값은 왼쪽 연관) —으로 작동했습니다. 그러나 스칼라 2.5에서는 match이 메서드 대신 특수 언어 구문으로 만들어졌습니다. 불행히도, 나는 왜 그런 일이 일어 났는지 모르지만 그 이유는 : match이 아니고, 중위 연산자입니다.