Odersky的Coursera讲座:为什么类型检查器不能推断值类型Int?

Rah*_*thy 3 scala type-inference

我的问题是关于奥德斯基的讲座3.5(不是作业!):

19:15的练习问:"这是什么类型:if (true) 1 else false"

在他的解释中,Odersky认为类型是AnyVal因为它是IntBoolean(两个条件分支的类型)最具体的超类型.

我问自己为什么类型检查器不够智能,只能看到第一个分支实际上是相关的,因此可以推断出类型Int

Tom*_*icz 11

这是一个类似的问题,为什么以下不能用Java编译:

throw new Foo();
return 42;  //unreachable statement
Run Code Online (Sandbox Code Playgroud)

但这编译:

if(true)
  throw new Foo();
return 42;
Run Code Online (Sandbox Code Playgroud)

基本上编译器必须停在某处.特别是Scala编译器,已经很慢了.一旦识别true一如既往通态的,有人可能会问:怎么样:1 == 1,2 * 21 == 42甚至x == 7哪里xval.

绘制一条线是很困难的,因此编译器只是假设每个都if可以有两个分支.IDE或代码验证工具负责发现这些不可能或可能不正确的表达式.