F# 类型规则作为推理规则

F# typing rules as inference rules

由于 F# 使用 type inferencing and type inferencing uses type rules, where are the F# type rules expressed as inference rules 找到。我怀疑它们没有发布,也没有很容易找到,甚至没有作为推理规则提供,这就是我问的原因。

谷歌搜索 F# type rules returns 没有任何相关内容。

搜索 F# spec 给出了 section 14 - Inference Procedures 中的解释,但没有给出实际规则。

我知道我可以通过阅读 F# 源代码来提取它们,(Microsoft.FSharp.Compiler.ConstraintSolver),但这可能需要时间来提取和验证。此外,虽然我精通 Prolog,它在理解约束求解器方面提供了一些帮助,但我仍然需要学习它才能阅读它。

您是正确的,F# 类型推断和类型检查的正式规范将使用推断规则的格式编写。

问题是任何现实的编程语言对于这种正式规范来说都太复杂了。如果您想捕获 F# 类型推断的全部复杂性,那么您只需使用数学符号来编写与 F# 编译器源代码中基本相同的内容。

因此,编程语言理论家通常会为整个系统的一些有趣的子集编写类型和推理规则 - 以说明与某些新方面相关的问题。

  • F# 类型系统的核心部分基于标准 ML 语言。您可以找到 The Definition of Standard ML (PDF) 中正式指定的 ML 的合理子集。这解释了一些有趣的事情,例如 "value restriction" 规则。

  • 我做了一些工作来规范 F# 数据库的工作方式,这包括一个简单的位类型检查模型,您可以在 F# Data paper 中找到它。

  • F# Computation Zoo paper (PDF) 定义了 F# 计算表达式如何工作的类型化规则。这实际上捕获了典型的用例,而不是编译器所做的。

总而言之,我认为在类型化规则方面期望 F# 类型推断的正式规范是不可行的,但我认为任何其他语言都没有这样的功能。语言的正式模型更多地用于探索小子集的微妙之处,而不是谈论整个语言。