2010-11-29 84 views
13

我读过Scala的类型推断不是全局的,所以人们必须在方法上放置类型注释。 (这是否是“本地”类型推断?)关于Scala,“没有全局类型推断”是什么意思?

我只有一点理解,其原因是从其面向对象的性质,但清晰度避开了我。是否有解释“全球类型推断”,为什么Scala不能让初学者理解?

回答

16

全局类型推断的典型示例是Hindley-Milner:它需要一个给定的程序并“计算”所有必需的类型。然而,为了达到这个目的,给定的语言需要有一些属性(HM有扩展,试图克服这些限制)。 HM不喜欢的两件事是继承和方法重载。据我了解,这些是Scala采用HM或其变体的主要障碍。请注意,实际上甚至严重依赖于HM的语言也不会达到100%的推论,例如,即使在Haskell中,你也需要不时的类型注释。因此斯卡拉使用更有限的类型推断形式(如你所说的“本地”),这种形式仍然比没有好。据我所知,Scala团队试图在发布到发布的时候尝试改进类型推断,但到目前为止,我只看到了更小的步骤。与HM风格类型推理器的差距仍然很大,并且不能完全关闭。

22

问题在于HM类型推断通常在具有子类型,超载或类似特征的语言中是不可判定的。 Ref这意味着越来越多的东西可以被添加到推理程序,以推断更多特殊情况,但总是会有代码在哪里会失败。

斯卡拉决定在方法参数中进行类型注释,而其他一些地方是强制性的。这看起来似乎很麻烦,但考虑到这有助于记录代码并向编译器提供它可以在一个地方理解的信息。另外,HM推理的语言经常会遇到这样的问题,即有时在远离原始错误的代码中检测到编程错误,因为HM算法刚刚出现并偶然发生(偶然)推断具有错误类型的代码的其他部分它在失败之前推断出来。

Scala的推理基本上从外部(方法定义)到内部(方法内部的代码),因此限制了错误类型注释的影响。

HM推理的语言从内部到外部工作(忽略了添加类型注释的可能性),这意味着一个单一方法中的小代码更改有可能改变整个程序的含义。这可能是好的或坏的。


编号:Lower bounds on type inference with subtypes

+0

+1给了理论上的原因 – axel22 2010-11-29 16:55:35