我看到这里有一些关于静态和动态类型的有趣讨论。我通常更喜欢静态类型,因为它可以进行编译时类型检查,代码文档化程度更高等等。但是,如果像Java那样实现,它们确实会使代码变得混乱。
所以,我即将开始构建自己的函数式语言,类型推断是我想要实现的其中之一。我确实明白这是一个大主题,我并不想创造以前没有做过的东西,只是基本的推断...
有什么指导可以帮助我完成这个功能吗?最好是一些实用的东西,而不是更加理论的范畴论/类型论文本。如果有一个实现讨论的文本,带有数据结构/算法,那就太好了。
我看到这里有一些关于静态和动态类型的有趣讨论。我通常更喜欢静态类型,因为它可以进行编译时类型检查,代码文档化程度更高等等。但是,如果像Java那样实现,它们确实会使代码变得混乱。
所以,我即将开始构建自己的函数式语言,类型推断是我想要实现的其中之一。我确实明白这是一个大主题,我并不想创造以前没有做过的东西,只是基本的推断...
有什么指导可以帮助我完成这个功能吗?最好是一些实用的东西,而不是更加理论的范畴论/类型论文本。如果有一个实现讨论的文本,带有数据结构/算法,那就太好了。
我发现以下资源对于理解类型推断非常有帮助,按照难度递增的顺序排列:
+
运算符,则操作数和结果必须都是数字。应用函数的节点与函数结果具有相同的类型,以此类推。let
的语言,可以通过替换来盲目地解决上述约束条件。例如:(if (= 1 2)
1
2)
(let ((id (lambda (x) x)))
(id id))
id
绑定到一个返回任何你传入的参数的函数上,也就是所谓的身份函数。问题在于函数参数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和约束生成和解决的整个概念联系起来。它有点密集,但比很多其他资源都好:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
其他的论文也很不错:
http://people.cs.uu.nl/bastiaan/papers.html
我希望这有助于澄清一个有些模糊的世界。
《类型与编程语言》(Benjamin C. Pierce著)