首页 文章

将OCaml转换为F#:键入和类型推断之间的差异

提问于
浏览
7

在研究F#和OCaml之间的差异时,我发现他们倾向于关注nominativestructural type system . 然后我找到了Distinctive traits of functional programming languages,其中列出了键入和类型推断作为不同的特征 .

由于特质文章说OCaml和F#都使用Damas-Milner类型推断,我认为这是一种标准算法,即一种不允许变化的算法,这两种特征如何相关?是不是Damas-Milner是 Build 两种类型推理系统的基础,但是他们每个都根据打字修改Damas-Milner?

我还检查了F#源代码中的Damas,Milner和Hindley这两个词,但没有找到 . 搜索单词推断会出现类型推断的代码 .

如果是这样,是否有任何论文讨论特定语言的每种类型推理算法的细节,或者我必须查看OCamlF#的源代码 .

编辑

这是一个page,它强调了与OCaml和F#之间的类型推断相关的一些差异 .

3 回答

  • 2

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

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

  • 6

    由于特质文章说OCaml和F#都使用Damas-Milner类型推断,我认为这是一种标准算法,即一种不允许变化的算法,这两种特性如何相关?

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

    Damas-Milner是 Build 这两种类型推理系统的基础,但他们是否都根据打字修改了Damas-Milner?

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

    我不是't believe there are summary papers describing the whole type systems of either OCaml or F#. Indeed, I do not know of a paper that describes today'的F#型系统 . 对于OCaml,您有许多不同的论文,每篇论文涵盖不同的方面 . 我将从Jacques Garrigue's own publications开始,然后按照其中的参考资料 .

  • 4

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

    OCaml中的对象系统与F#中基于.NET类的对象系统非常不同 . 在OCaml中,您可以直接创建对象而无需使用类 . 类基本上是用于创建对象的便利函数 . 创建后的对象(直接使用文字或使用类创建)没有其类的概念 .

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

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

    参数类型被推断为包含名为 bar 的方法的抽象类型 . 所以它可以采用这种方法和类型的任何对象 .

    当他们说对象系统是结构类型时,这意味着什么 . 关于对象唯一重要的是它的一组方法,它决定了它的使用位置 . 所以兼容性只是基于方法的“结构” . 而不是任何“阶级”的想法 .

相关问题