将OCaml转换为F#:类型化和类型推理之间的区别



在研究F#和OCaml之间的类型推理差异时,我发现他们倾向于关注主格与结构类型系统。然后,我发现了函数式编程语言的独特特征,它们将类型和类型推理列为不同的特征。

既然trait文章说OCaml和F#都使用Damas-Milner类型推理,我认为这是一种标准算法,即一种不允许变异的算法,那么这两个trait是如何联系的呢?是不是Damas-Milner是两个类型推理系统构建的基础,但它们都是基于类型来修改Damas-Millner的?

此外,我检查了单词Damas、Milner和Hindley的F#源代码,没有发现任何内容。对单词推理的搜索找到了类型推理的代码。

如果是这样的话,有没有论文讨论了特定语言的每种类型推理算法的细节,或者我是否必须查看OCaml和F#的源代码。

编辑

这是一个页面,重点介绍了OCaml和F#之间与类型推断相关的一些差异。

关于你的DM问题,你是对的。对于F#和OCaml来说,DM算法只是一种模式。类型检查器经过扩展以支持自定义功能。在OCaml中,这些特性包括具有行类型、多变量、一流模块的对象。在F#-中。NET类型的系统互操作(类、接口、结构、子类型、方法重载),度量单位。我认为F#类型推理也以从左到右的方式倾斜,以允许更高效的交互式检查,因此有些代码出人意料地需要注释。

就类型检查和推理而言,OCaml比F#更具表现力和直观性。SML比它们中的任何一个都更接近于普通HM,但SML也有一些扩展,用于一些运算符多态性和记录支持。

我相信当他们在OCaml中谈论结构类型时,他们可能指的是对象系统("OCaml"的"O"部分)。OCaml的非对象部分是相当标准的ML类型系统;对象系统是不寻常的。

OCaml中的对象系统与非常不同。NET类的对象系统。在OCaml中,您可以在不使用类的情况下直接创建对象。类基本上是创建对象的一个方便函数。创建后的对象(要么直接使用文字创建,要么使用类创建)没有其类的概念。

看看当你编写一个函数,接受一个对象并在上面调用一个特定的方法时会发生什么:

# let foo x = x#bar;;
val foo : < bar : 'a; .. > -> 'a = <fun>

参数类型被推断为包含名为bar的方法的抽象类型。因此,它可以接受任何具有这种方法和类型的对象。

当他们说对象系统在结构上是类型化的时,这就是它的意思。对象唯一重要的是它的一组方法,这些方法决定了它可以在哪里使用。因此兼容性只是基于方法的"结构"。而不是任何"阶级"的概念。

既然trait文章说OCaml和F#都使用Damas-Milner类型推理,我认为这是一种标准算法,即一种不允许变异的算法,那么这两个trait是如何联系的呢?

Damas-Milner算法(也称为algorithm W)可以扩展,事实上,它的所有实际相关实现都添加了许多扩展,包括OCaml和F#。

是不是Damas-Milner是两个类型推理系统构建的基础,但它们都是基于类型来修改Damas-Millner的?

没错。特别是,OCaml对Damas-Milner核心有很多不同的实验扩展,包括多态变体、对象和一流模块。F#更简单,但也有一些OCaml没有的扩展,最显著的是重载(主要是运算符)。

我不相信有总结论文描述OCaml或F#的整个类型系统。事实上,我不知道有哪篇论文描述了今天的F#型系统。对于OCaml,您有许多不同的论文,每一篇都涵盖不同的方面。我会从雅克·加里格自己的出版物开始,然后遵循其中的参考文献。

最新更新