Compiler construction 实现类型推断

Compiler construction 实现类型推断,compiler-construction,functional-programming,language-design,type-inference,Compiler Construction,Functional Programming,Language Design,Type Inference,我在这里看到一些关于静态和动态类型的有趣讨论。 由于编译类型检查、更好的文档化代码等原因,我通常更喜欢静态类型。但是,我确实同意,例如,如果按照Java的方式进行,它们会使代码变得杂乱无章 所以我要开始构建自己的函数式语言,类型推断是我想要实现的事情之一。我明白这是一个大课题,我不想创造一些以前没有做过的东西,只是基本的推断 有没有什么建议可以帮助我阅读?最好是更实用/实用的,而不是更理论的范畴理论/类型理论文本。如果有实现讨论文本,有数据结构/算法,那就太好了。Lambda最终版,开始。类型和

我在这里看到一些关于静态和动态类型的有趣讨论。 由于编译类型检查、更好的文档化代码等原因,我通常更喜欢静态类型。但是,我确实同意,例如,如果按照Java的方式进行,它们会使代码变得杂乱无章

所以我要开始构建自己的函数式语言,类型推断是我想要实现的事情之一。我明白这是一个大课题,我不想创造一些以前没有做过的东西,只是基本的推断


有没有什么建议可以帮助我阅读?最好是更实用/实用的,而不是更理论的范畴理论/类型理论文本。如果有实现讨论文本,有数据结构/算法,那就太好了。

Lambda最终版,开始。

类型和编程语言由Benjamin C.Pierce编写。

我发现以下资源有助于理解类型推断,难度越来越大:

  • 第30章(类型推理),编程语言:应用和解释,基于统一的类型推理
  • 暑期课程介绍了优雅的评估员、类型检查员、类型重建员和使用Haskell作为元语言的推理员
  • 第7章(类型),编程语言要点
  • 第22章(类型重构),类型和编程语言,以及相应的OCaml实现和
  • 第13章(类型重构),编程语言中的设计概念
  • 闭包编译器是用于类型推断的数据流分析方法的一个示例,它比Hindler-Milner方法更适合于动态语言
  • 然而,由于最好的学习方法是做,我强烈建议通过完成编程语言课程的家庭作业来实现玩具函数式语言的类型推理

    我建议您使用ML编写以下两个可访问的家庭作业,两个作业都可以在不到一天的时间内完成:

  • ()热身
  • ()实现Hindley-Milner型推理的算法W
  • 来自更高级的课程:


  • 不幸的是,关于这一主题的许多文献都非常密集。我也站在你的立场上。我从编程语言:应用程序和解释中获得了对这个主题的第一次介绍

    我将尝试总结这个抽象的想法,然后是一些我没有立即发现的细节。首先,类型推理可以被认为是生成约束,然后求解约束。要生成约束,可以递归语法树,并在每个节点上生成一个或多个约束。例如,如果节点是
    +
    运算符,则操作数和结果都必须是数字。应用函数的节点具有与函数结果相同的类型,依此类推

    对于没有let的语言,可以通过替换盲目地解决上述约束。例如:

    (if (= 1 2) 
        1 
        2)
    
    在这里,我们可以说if语句的条件必须是布尔的,并且if语句的类型与其
    then
    else
    子句的类型相同。因为我们知道
    1
    2
    是数字,通过替换,我们知道
    if
    语句是数字

    事情变得很糟糕,我一时无法理解的是,如何处理let:

    (let ((id (lambda (x) x)))
        (id id))
    
    这里,我们将
    id
    绑定到一个函数,该函数返回您传入的任何内容,也称为identity函数。问题是函数的参数
    x
    的类型在
    id
    的每次使用上都不同。第二个
    id
    是类型
    a->a
    的函数,其中
    a
    可以是任何东西。第一种类型是
    (a->a)->(a->a)
    。这被称为let多态性。关键是按特定顺序求解约束:首先求解
    id
    定义的约束。这将是
    a->a
    。然后,可以将
    id
    类型的新的单独副本替换到每个使用
    id
    的位置的约束中,例如
    a2->a2
    a3->a3

    这在在线资源中并不容易解释。他们会提到算法W或M,但不会提到它们在解决约束方面是如何工作的,或者为什么它不会对let多态性发飙:这些算法中的每一个都在解决约束时强制执行一个顺序

    我发现这个资源非常有助于将算法W、M以及约束生成和求解的一般概念联系在一起。它有点密集,但比很多都好:

    那里的许多其他报纸也很不错:


    我希望这有助于澄清一个有点模糊的世界。

    除了函数式语言的Hindley Milner之外,还有一个 目前流行的动态语言类型推断方法是
    摘要解释

    抽象解释的思想是写一篇特殊的文章 语言的解释器,而不是保持 具体值(1,false,closure),它适用于抽象值,也就是 类型(int、bool等)。因为它在电视上解释节目 抽象值,这就是为什么它被称为抽象解释

    Pysonar2是抽象解释的优雅实现 对于Python。Google使用它来分析Python 项目。基本上,它使用
    访客模式
    进行调度 对相关AST节点的求值调用。访客功能 接受将在其中计算当前节点的
    返回当前节点的类型。

    正是我想要的问题,有一些很好的答案!仅仅是我,还是PLAI描述基本上不正确/不完整?再加上一点,bu