确定OCaml表达式类型的一般方法是什么?

Tre*_*ing 2 ocaml types functional-programming

我是OCaml和函数式编程的初学者.如果我有一个表达式,除了将其输入顶层并进行编译之外,我该如何确定其类型?

例如,如果我有

fun x -> fun (y, z) -> (x y) (z () )
Run Code Online (Sandbox Code Playgroud)

我怎样才能确定这个表达式的类型?它是否涉及任何聪明,或者是否有一个简单的算法可以帮助我思考如何确定任何表达式的类型?

Mar*_*Łoś 8

不需要聪明.确实存在确定类型的算法.Ocaml基于Hindley-Milner型系统.类型推断算法很少,您可以在文章中找到详细信息.至于你的例子,让我们尝试一点一点地搞清楚:

fun x -> fun (y, z) -> (x y) (z () )
Run Code Online (Sandbox Code Playgroud)
  • 整个表达式是一个函数,从某种类型A = typeof(x)到类型B = typeof(fun(y, z) -> (x y) (z ())).

  • z是类型() -> D,因为它被调用()并传递给x

  • 所以,类型z ()D

  • 因此类型(x y)(D -> E)

  • 让我们C的类型y

  • x因此,类型C -> (D -> E)

  • 而且类型(x y) (z ())就是E

  • 了解各种类型的x,y最后的表达,我们得出结论,整个表达式的类型(C -> D -> E) -> C * (() -> D) -> E