解析错误

问题描述:

当斯卡拉写下面的代码解析错误

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 

这是为什么? scala认为我的嵌套元组是什么?

+0

我*始终*犯同样的错误 – 2009-09-08 16:08:24

原因很简单(我认为),是与事实这样做(在Map性状):

m += (a -> b) 

简写为:

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

显然,如果你使用在第一个例子中的逗号,Scala会将其解释为对该方法的调用:

m = m.+(a, b) 

这种方法在Map特征上不存在。方法调用规则意味着首先对a -> b进行评估(至Tuple2),因此调用了正确的方法。 注:使用一个额外的对括号工作得很好:

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

实际上,我是很肯定的OBJ欧普强的松相当于Pred.Op((强的松))了。用(在标准库或Lift中)调用带有两个参数的函数作为操作符吗? (一个有意义的例子,你可以随时做“数组更新(x,y)”,但它看起来很奇怪。 – 2009-09-09 03:59:43

+0

我同意你的意见Elazar。我认为编译器应该有更多的意义 – 2009-09-09 09:21:25

故道是正确的。您可以使用其他括号来消除歧义,但:

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

我相信我指出额外的括号解决了这个问题 – 2009-09-09 09:28:57