2014-11-09 5 views
8

나는 스칼라에 일치하는이 패턴에 관한 질문했습니다 : 나는 어떻게 패턴 매칭 작품과 스칼라에서의 syntaxis을 이해했습니다패턴 매칭 함수 인수는

val div: (Double, Double) => Double = { 
    case (x, y) if y != 0 => x/y 
} 

을하지만,이 표현은 미친 저를 구동한다. 컴파일러는 x와 y가 함수와 패턴 매치의 인수라는 것을 어떻게 알 수 있습니까?

답변

9

이 규칙은 스칼라 언어 사양의 8.5 "Pattern Matching Anonymous Functions" 섹션에 정의되어 있습니다. 패턴 일치가있는 익명의 함수를 사용하는 경우 유형을 부분적으로 제공해야합니다. 형식은 (Double, Double) => Double이며 Function2[Double, Double, Double]의 줄임말로 알 수 있습니다. 이제

:

예상되는 형태가 scala.Function k [S1,…,Sk, R] 경우는, 표현이 익명 함수에 해당 될 가져온 것입니다

 
(x1:S1,…,xk:Sk) => (x1,…,xk) match { 
    case p1 => b1 … case pn => bn 
} 
그래서 상관없이

어떤 함수의 인수에 대응, 패턴 일치는 함수 인수의 튜플을 통과하므로 일반 튜플 추출기 구문을 사용할 수 있습니다.

그래서 예 xy은 당신의 상상력에 달려 있습니다 추출기 매개 변수의 명명

val div: (Double, Double) => Double = (a, b) => (a, b) match { 
    case (x, y) if y != 0 => x/y 
} 

또는

val div = (a: Double, b: Double) => (a, b) match { 
    case (x, y) if y != 0 => x/y 
} 

의 약자입니다. 추출기의 결과 요소를 호출하는 방법을 결정하면 case (foo, bar) => ...