Compiler construction 实现类型推断
我在这里看到一些关于静态和动态类型的有趣讨论。 由于编译类型检查、更好的文档化代码等原因,我通常更喜欢静态类型。但是,我确实同意,例如,如果按照Java的方式进行,它们会使代码变得杂乱无章 所以我要开始构建自己的函数式语言,类型推断是我想要实现的事情之一。我明白这是一个大课题,我不想创造一些以前没有做过的东西,只是基本的推断Compiler construction 实现类型推断,compiler-construction,functional-programming,language-design,type-inference,Compiler Construction,Functional Programming,Language Design,Type Inference,我在这里看到一些关于静态和动态类型的有趣讨论。 由于编译类型检查、更好的文档化代码等原因,我通常更喜欢静态类型。但是,我确实同意,例如,如果按照Java的方式进行,它们会使代码变得杂乱无章 所以我要开始构建自己的函数式语言,类型推断是我想要实现的事情之一。我明白这是一个大课题,我不想创造一些以前没有做过的东西,只是基本的推断 有没有什么建议可以帮助我阅读?最好是更实用/实用的,而不是更理论的范畴理论/类型理论文本。如果有实现讨论文本,有数据结构/算法,那就太好了。Lambda最终版,开始。类型和
有没有什么建议可以帮助我阅读?最好是更实用/实用的,而不是更理论的范畴理论/类型理论文本。如果有实现讨论文本,有数据结构/算法,那就太好了。Lambda最终版,开始。类型和编程语言由Benjamin C.Pierce编写。我发现以下资源有助于理解类型推断,难度越来越大:
不幸的是,关于这一主题的许多文献都非常密集。我也站在你的立场上。我从编程语言:应用程序和解释中获得了对这个主题的第一次介绍 我将尝试总结这个抽象的想法,然后是一些我没有立即发现的细节。首先,类型推理可以被认为是生成约束,然后求解约束。要生成约束,可以递归语法树,并在每个节点上生成一个或多个约束。例如,如果节点是
+
运算符,则操作数和结果都必须是数字。应用函数的节点具有与函数结果相同的类型,依此类推
对于没有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