functional-programming - 简单类型的 lambda 演算与 Hindley-Milner 类型系统

标签 functional-programming type-inference lambda-calculus parametric-polymorphism hindley-milner

我最近一直在学习 λ 演算。我理解无类型和有类型 λ 演算之间的区别。但是,我不太清楚 之间的区别。 Hindley-Milner 型系统 类型化 λ 演算 .是关于parametric polymorphism或者还有其他区别吗?

谁能清楚地指出两者之间的差异(和相似之处)?

最佳答案

我看之间关系的方式类型化 λ 演算 Hindley-Milner 型系统 类型化 λ 演算 λ-演算添加类型。你可以做类型化 λ 演算 不需要 Hindley-Milner 型系统 ,例如所有类型都被声明,它们不被推断。

现在如果你要写一个 strongly statically typed基于的编程语言类型化 λ 演算 并想省略 type annotations允许类型为 inferred然后 type inference被使用,并且很可能你会使用 Hindley-Milner 型系统 或者它的一个变种。

另一种思考方式是在创建基于 的编程语言时类型化 λ 演算 是编译器会有 phases ,其中之一将使用 Hindley-Milner 型系统 .阶段的顺序是:

  • 语法检查 - Lexer
  • 语义检查 - Parser
  • Type inference - Hindley-Milner type system
  • Type checking
  • ...

  • 另一种思考方式是 type system有一套type rules还有那个 Hindley-Milner type system是具有特定类型规则集的特定类型系统。 Hindley-Milner type system的主要好处之一是推断类型的时间效率高,并且还有许多类型规则soughtfunctional programming ,例如Let-polymorphismparametric polymorphism .在现实世界中,如果您正在创建一种编程语言并希望推断类型,那么您希望在合理的时间内完成,例如秒。自 inferencing可能导致 combinatorial explosion经常寻求一套有效的规则,这就是为什么 Hindley-Milner type system 的主要原因之一。被如此频繁地使用或引用。

    适用于基于 的现实世界编程语言类型化 λ 演算 System F .

    关于functional-programming - 简单类型的 lambda 演算与 Hindley-Milner 类型系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52595339/

    相关文章:

    javascript - 将具有副作用的简单算法重构为 FP 风格 - 更新任务状态

    list - 在方案编程方面需要帮助

    haskell - 什么是单态性限制?

    generics - F# 编译器在 currying 时从首次使用泛型函数推断具体类型

    recursion - 如何使用 Clojure 语言的子集在 lambda 演算中实现递归函数?

    evaluation - 我对按需评估有何误解?

    haskell - 显式确定要使用哪个纯函数

    list - 如何在 Haskell 中保持比率的非约简形式

    scala - 为什么我需要为无关输入指定类型?

    math - 哪些术语对应于类别理论中的 Map、Filter、Foldable、Bind 等?