gpt4 book ai didi

oop - 为什么类型推断对于面向对象的语言不切实际?

转载 作者:行者123 更新时间:2023-12-03 23:32:14 24 4
gpt4 key购买 nike

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

我对 Haskell 等语言真正着迷的一件事是它是静态类型的,但您不必注释类型(感谢 Hindley-Milner!)。

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

我真的很想对此进行解释,最好是关于面向对象语言无法进行类型推断的场景的示例。

最佳答案

补充 seppk 的回应:使用结构对象类型,他描述的问题实际上消失了(f 可以被赋予一个多态类型,如 ∀A ≤ {x : Int, y : Int}。A → Int,或者甚至只是 {x : Int , y : Int} → Int)。但是,类型推断仍然存在问题。

根本原因是:在没有子类型的语言中,类型规则对类型施加了相等性约束。这些在类型检查期间非常好处理,因为它们通常可以通过对类型进行统一来立即简化。然而,通过子类型化,这些约束被推广到不等式约束。您不能再使用统一,这至少会带来三个令人不快的后果:

  • 约束的数量和复杂性成组合地爆炸式增长。
  • 出现错误时您必须向用户显示的信息是难以理解的。
  • 某些形式的量化很快就会变得不可判定。

  • 因此,子类型的类型推断并非不可能(90 年代有很多关于该主题的论文),但它不是很实用。

    OCaml 采用了一个更简单的替代方案,它使用所谓的行多态性代替子类型。这实际上是易于处理的。

    关于oop - 为什么类型推断对于面向对象的语言不切实际?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22528534/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com