我已经读过Scala的类型推断不是全局的,所以人们必须在方法上放置类型注释。 (这会是“本地”类型推断吗?)
我只是有点明白,原因是它的面向对象性质,但清晰度使我无法理解。是否有“全局类型推断”的解释以及为什么Scala不能让初学者理解它?
答案 0 :(得分:22)
问题在于HM类型推断通常在具有子类型,重载或类似特征的语言中是不可判定的。Ref这意味着可以将越来越多的东西添加到推理器中以使其推断出更特殊的情况,但总有代码会失败。
Scala决定在方法参数和其他一些地方强制进行类型注释。这可能看起来像是一个麻烦,但请注意,这有助于记录代码并为编译器提供它可以在一个地方理解的信息。另外,具有HM推断的语言经常遇到这样的问题,即有时在远离原始错误的代码中检测到编程错误,因为HM算法只是偶然发生(偶然)用错误类型推断代码的其他部分。它在失败之前推断出来。
Scala的推理基本上是从外部(方法定义)到内部(方法内部的代码),因此限制了错误类型注释的影响。
HM推理的语言从内到外工作(忽略添加类型注释的可能性),这意味着单个方法中的小代码更改可能会改变整个程序的含义。这可能是好事还是坏事。
答案 1 :(得分:16)
全局类型推断的典型示例是Hindley-Milner:它需要一个给定的程序并“计算”所有必需的类型。然而,为了实现这一点,给定的语言需要具有一些属性(HM有扩展,试图克服这些限制)。 HM不喜欢的两件事是继承和方法重载。据我所知,这些是Scala采用HM或其某些变体的主要障碍。请注意,在实践中,即使是严重依赖HM的语言也不会达到100%的推断,例如:即使在Haskell中,您也需要不时使用类型注释。
因此Scala使用更有限的(如你所说的“本地”)类型推断形式,这仍然比没有好。据我所知,Scala团队试图在可能的情况下改进从发布到发布的类型推断,但到目前为止,我只看到了更小的步骤。与HM风格类型推理器的差距仍然很大,无法完全关闭。