2010-10-06 72 views

回答

11

首先,Scala的情况与Haskell有很大不同,因为它是面向对象的语言,面向对象设置中的类型推断有点复杂。

我知道的唯一的OO语言接近全类型推断是OCaml。 OCaml通过广泛使用结构分型来实现这一点(let f o = o.foo 42中的o的推断类型是“具有foo方法的对象,其将int作为参数”并且推断的返回类型是“无论o.foo的返回类型是什么”,这是这里推断的唯一有用的类型)。

但是Scala有很多额外的功能(重载,隐式转换)妨碍了OCaml的方法,并且无法进行全面的全局类型推断。

+1

是的。特别是超载是Hindley-Milner式推理的一个难题。 – Landei 2010-10-06 10:14:34

6

简而言之,Haskell使用的类型推断算法Hindley-Milner在存在子类型时不起作用。

+1

除了简单修改的​​版本* does *在OCaml中工作,它具有子类型。当然,它是*结构*子类型,而不是斯卡拉的主格子类型。 – 2013-10-29 06:44:16

相关问题