OCaml显式类型签名

Xod*_*rap 30 syntax ocaml types type-inference

在Haskell中,明确声明函数的类型签名被认为是一种好习惯,即使它(通常)可以推断出来.看起来这在OCaml中甚至不可能,例如

val add : int -> int -> int ;;
Run Code Online (Sandbox Code Playgroud)

给了我一个错误.(虽然我可以制作type只提供签名的模块.)

  1. 我是否正确,这在OCaml中是不可能做到的?
  2. 如果是这样,为什么?OCaml的类型系统似乎与Haskell完全不同.

Don*_*art 46

OCaml有两种指定类型的方法,它们可以内联完成:

let intEq (x : int) (y : int) : bool = ...
Run Code Online (Sandbox Code Playgroud)

或者它们可以放在接口文件中,如下所示:

val intEq : int -> int -> bool
Run Code Online (Sandbox Code Playgroud)

我相信后者是首选,因为它更清晰地将规范(类型)与实现(代码)分开.


参考文献:Haskellers的OCaml

  • 那根本不对。OCaml 4.04.0及更高版本支持界面文件。.mli文件是声明模块接口的首选方法。 (3认同)
  • 后一个选项不再是有效的选项。至少 OCaml 4.04.0 不支持它。每个人都应该使用第一个选项。 (2认同)

小智 17

我一般来说,let使用约束类型绑定值的语法是:

let val : constraint = e ...
Run Code Online (Sandbox Code Playgroud)

应用于函数,您可以按如下方式指定签名:

let add : int -> int -> int = fun x y -> ...
Run Code Online (Sandbox Code Playgroud)

这类似于将模块约束到签名所需的语法:

module Mod
  : sig    ... end
  = struct ... end
Run Code Online (Sandbox Code Playgroud)