我读到Scala的类型推理不是全局的,因此人们必须在方法上放置注释。 (这会是“本地”类型推理?)

我只了解原因是其面向对象的性质,但Clarity避开了我。是否有“全局类型推理”的解释,为什么Scala不能拥有初学者可能会理解的?

有帮助吗?

解决方案

全局类型推理的典型示例是 Hindley-Milner: :它采用给定的程序并“计算”所有必要类型。但是,为了实现这一目标,给定的语言需要具有一些属性(HM有扩展,试图克服其中一些限制)。 HM不喜欢的两件事是继承和方法过载。据我了解,这些是Scala采用HM或某种变体的主要障碍。请注意,在实践中,即使是严重依赖HM的语言也永远不会达到100%的推断,例如,即使在Haskell中,您也需要不时进行注释。

因此,Scala使用类型推理的更有限的(您说的“本地”)形式,这总比没有好。据我所知,Scala团队试图在可能的情况下改善从发布到发布的类型推断,但是到目前为止,我只看到了较小的步骤。 HM样式类型推理器的差距仍然很大,不能完全封闭。

其他提示

问题在于,HM类型推理通常是在具有子类型,超载或类似功能的语言中不可决定的。参考 这意味着越来越多的东西可以添加到推断器中,以使其推断出更多的特殊情况,但是总会有代码失败。

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

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

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


参考: Lower bounds on type inference with subtypes

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top