Scala在2.10中通过模式匹配改进了什么?

Scala在2.10中通过模式匹配改进了什么?,scala,scala-2.10,Scala,Scala 2.10,我发现有趣的是,特别是这段代码: val (i, j): (Int, Int) = ("3", "4") 在Scala 2.9.1中运行时失败,但在编译时w/2.10 M3时失败(这很好)。我试图跟踪新的Scala版本中会出现什么,但我无法在这里连接这些点。是什么改进导致了这种更精确的行为?在scala 2.10中,模式匹配器完成了重新写入,现在是虚拟化模式匹配器 新的模式匹配器更易于增强和维护,因为它不是一段代码。以下示例代码也应显示相同的更改: ("3", "4") match { cas

我发现有趣的是,特别是这段代码:

val (i, j): (Int, Int) = ("3", "4")

在Scala 2.9.1中运行时失败,但在编译时w/2.10 M3时失败(这很好)。我试图跟踪新的Scala版本中会出现什么,但我无法在这里连接这些点。是什么改进导致了这种更精确的行为?

在scala 2.10中,模式匹配器完成了重新写入,现在是虚拟化模式匹配器

新的模式匹配器更易于增强和维护,因为它不是一段代码。以下示例代码也应显示相同的更改:

("3", "4") match { case (i, j): (Int, Int) => /* whatever */ }

发生的事情是Scala在编译时理解到模式永远无法匹配。

我不知道为什么在运行时失败,而在任何版本的Scala中编译时都不会失败。
val(I:Int,j:Int)=(“3”,“4”)
在2.9中编译时失败。1@pmcs-斯卡拉很棒!但没有什么是完美的;)@Dan-scala中的赋值如下:
val p=x
其中
p
是任何模式。模式
x:(Int,Int)
是一个运行时类型检查,但请记住,在运行时,由于类型擦除,类型
(Int,Int)
实际上只是
Tuple2
。这就是为什么它会编译,但在runtime@pmcs与python最接近的Scala等价物是:
val(i,j)=(“3”,“4”)
。它只是工作。在python中,如果需要算术,则需要转换int中的字符串。除非传递标志iirc,否则虚拟部分只是内部的。实际输出不是虚拟的(也就是说,没有实现为对monad的调用)。但是主要的一点是,它代表了一个完整的重写(这可以解释为什么它的行为可能已经改变了),为什么模式匹配器应该对这个例子做出任何改变?我希望编译器在类型检查过程中在代码到达模式匹配器之前拒绝它。。。