2009-09-08 9 views
9

구문 분석 오류가

var m = Map((0,1) -> "a") 
m += ((0,2), "b") // compilation error 

나는 오류

 
type mismatch; 
found : Int(0) 
required: (Int, Int) 

받고 있어요 그러나 (X,Y)(X -> Y)에 작품에서 튜플의 변화 구문

var m = Map((0,1) -> 'a) 
m += ((0,2) -> 'b) // compiles file 

비록

((0,1).getClass == (0 -> 1).getClass) // is true 
(0,1).isInstanceOf[Tuple2[_,_]] && (0 -> 1).isInstanceOf[Tuple2[_,_]] // both true 

왜 그렇습니까? 스칼라 내 중첩 튜플은 무엇이라고 생각합니까?

+0

나는 * 내가 실제로의 Obj 연산 Pred를 가산이 Pred.Op 이미 ((Pred를 가산))에 해당 꽤 확신했다 같은 실수 –

답변

10

이유는 (내가 생각하는) 아주 간단하고합니다 (Map 특성에) 사실과 관련이있다 : 분명히 당신이 사용하는 경우

m = m.+(t2) //where t2 is of type Tuple2[A,B] 

:

m += (a -> b) 

을위한 속기 첫 번째 예제의 쉼표 인 경우 스칼라는이 메서드 호출에 대한 것으로 해석합니다.

m = m.+(a, b) 

이 방법은 Map 특성에 존재하지 않습니다. 메서드 호출 규칙은 a -> b이 먼저 평가되고 (Tuple2) 따라서 올바른 메서드가 호출됨을 의미합니다. 참고 : 괄호의 추가 쌍을 사용하여 잘 작동합니다 :

m += ((a,b)) //works just fine but less readable 
+0

을 항상 *. 두 개의 인수가있는 함수를 연산자로 호출하는 용도 (표준 라이브러리 또는 리프트)가 있습니까? (물론 이해할 수있는 예는 "array update (x, y)"라고 할 수 있지만, 이상하게 보입니다. –

+0

Elazar에 동의합니다. 컴파일러가 좀 더 의미가 있다고 생각합니다. –

0

옥스 보우가 올바른지. 당신은하지만, 명확하게 다른 괄호를 사용할 수 있습니다

m += (((0,2), "b")) 
+0

나는 믿습니다. 나는 여분의 괄호가 문제를 해결했다는 것을 지적했다. –