在研究F#和OCaml之间的type inference差异时,我发现他们倾向于关注nominative与structural type system。然后我发现Distinctive traits of functional programming languages列出了输入和类型推断的不同特征。
由于特质文章说OCaml和F#都使用我认为是标准算法的Damas-Milner类型推断,即不允许变化的算法,这两个特征如何相关?是不是Damas-Milner是构建两个类型推理系统的基础,但他们每个都根据打字修改Damas-Milner?
我还检查了F#源代码中的Damas,Milner和Hindley这两个词,但没有找到。搜索单词推断会调出类型推断的代码。
如果有,是否有任何论文讨论特定语言的每种类型推理算法的细节,或者我是否必须查看OCaml和F#的源代码。
修改
这是一个page,突出显示了与OCaml和F#之间的类型推断相关的一些差异。
答案 0 :(得分:6)
关于你的DM问题,你是对的。对于F#和OCaml,DM算法只是一种模式。类型检查器已扩展为支持自定义功能。在OCaml中,这些功能包括具有行类型,多变量,一流模块的对象。在F#中 - .NET类型系统互操作(类,接口,结构,子类型,方法重载),度量单位。我认为F#类型推断也是以从左到右的方式倾斜,以允许更有效的交互式检查,因此一些代码令人惊讶地需要注释。
就类型检查和推理而言,OCaml比F#更具表现力和直观性。 SML比其中任何一个都更接近vanilla HM,但SML也有一些扩展用于某些运算符多态和记录支持。
答案 1 :(得分:4)
我相信当他们谈论OCaml中的结构类型时,他们可能指的是对象系统(“OCaml”的“O”部分)。 OCaml的非对象部分是非常标准的ML类型系统;这是不寻常的对象系统。
OCaml中的对象系统与F#中基于.NET类的对象系统非常不同。在OCaml中,您可以直接创建对象而无需使用类。类基本上是用于创建对象的便利函数。创建后的对象(直接使用文字或使用类创建)没有类的概念。
看看当你编写一个接受一个对象并在其上调用特定方法的函数时会发生什么:
# let foo x = x#bar;;
val foo : < bar : 'a; .. > -> 'a = <fun>
参数类型被推断为包含名为bar
的方法的抽象类型。所以它可以采用这种方法和类型的任何对象。
当他们说对象系统是结构类型时,这意味着什么。关于对象唯一重要的是它的一组方法,它们决定了它的使用位置。所以兼容性只是基于方法的“结构”。而不是任何“阶级”的想法。
答案 2 :(得分:2)
由于特质文章说OCaml和F#都使用Damas-Milner类型推断,我认为这是一种标准算法,即一种不允许变化的算法,这两种特征如何相关?
可以扩展Damas-Milner算法(也称为算法W),实际上,它的所有实际相关实现都添加了许多扩展,包括OCaml和F#。
是否Damas-Milner是构建两种类型推理系统的基础,但他们是否都根据输入修改了Damas-Milner?
没错,是的。特别是,OCaml对Damas-Milner核心有许多不同的实验扩展,包括多态变体,对象,一流模块。 F#更简单,但也有一些OCaml没有的扩展,最显着的是重载(主要是运算符)。
我不相信有描述OCaml或F#的整个类型系统的摘要文件。实际上,我不知道一篇描述今天的F#型系统的论文。对于OCaml,您有许多不同的论文,每篇论文涵盖不同的方面。我将从Jacques Garrigue's own publications开始,然后按照其中的参考文献进行操作。