作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在研究一种新的编程语言的想法,理想情况下我希望该语言混合一些功能和过程(面向对象)概念。
我对 Haskell 等语言真正着迷的一件事是它是静态类型的,但您不必注释类型(感谢 Hindley-Milner!)。
我真的很喜欢我的语言,但是在阅读了这个主题之后,似乎大多数人都同意类型推断对于子类型/面向对象是不切实际的/不可能的,但是我不明白为什么会这样。我不知道 F#,但我知道它使用 Hindley-Milner 并且是面向对象的。
我真的很想对此进行解释,最好是关于面向对象语言无法进行类型推断的场景的示例。
最佳答案
补充 seppk 的回应:使用结构对象类型,他描述的问题实际上消失了(f 可以被赋予一个多态类型,如 ∀A ≤ {x : Int, y : Int}。A → Int,或者甚至只是 {x : Int , y : Int} → Int)。但是,类型推断仍然存在问题。
根本原因是:在没有子类型的语言中,类型规则对类型施加了相等性约束。这些在类型检查期间非常好处理,因为它们通常可以通过对类型进行统一来立即简化。然而,通过子类型化,这些约束被推广到不等式约束。您不能再使用统一,这至少会带来三个令人不快的后果:
关于oop - 为什么类型推断对于面向对象的语言不切实际?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22528534/
我是一名优秀的程序员,十分优秀!