我目前正在研究一种新的编程语言的想法,理想情况下,我希望该语言将一些功能和过程(面向对象)概念混合在一起。

对于Haskell这样的语言,我真正着迷的一件事是它是静态类型的,但是您不必注释类型(神奇的是,得益于Hindley-Milner!)。

我真的很喜欢这种语言,但是在阅读了该主题之后,似乎大多数人都认为类型推断对于子类型/面向对象是不切实际的/不可能的,但是我不明白为什么这样做。我不知道F#,但我知道它使用Hindley-Milner AND并且是面向对象的。

我真的想对此进行解释,最好是在面向对象语言无法进行类型推断的情况下提供示例。

最佳答案

当使用名义类型(这是一个类型系统,其中成员名称相同且类型相同的两个类不可互换)时,类似以下方法的类型可能很多:

let f(obj) =
    obj.x + obj.y


任何同时具有成员x和成员y(支持+运算符的类型)的类都可以用作obj的可能类型,并且类型推断算法将无法知道哪个类型是您想要的那个。

在F#中,上面的代码将需要类型注释。因此,F#具有面向对象和类型推断的功能,但不是同时存在的(局部类型推断(let myVar = expressionWhoseTypeIKNow)除外,后者始终有效)。

08-06 00:42