OCaml 显式类型签名

45
在 Haskell 中,明确声明函数的类型签名被认为是一种良好的实践,即使它可以(通常)被推断。在 OCaml 中似乎甚至不可能这样做,例如:
val add : int -> int -> int ;;

在OCaml中是否无法实现这一点?(尽管我可以创建仅提供签名的type模块。)

  1. 如果是这样,我是正确的吗?
  2. 如果是这样,为什么? OCaml的类型系统似乎与Haskell的差别并不那么大。
2个回答

64

OCaml有两种指定类型的方式,可以在代码中直接声明:

let intEq (x : int) (y : int) : bool = ...

或者它们可以放在接口文件中,就像你所做的那样:

val intEq : int -> int -> bool

我认为后者更受欢迎,因为它更清晰地分离了规范(类型)和实现(代码)。


参考资料: 针对Haskell程序员的OCaml


2
后一种选项不再是有效的选项。至少OCaml 4.04.0不支持它。每个人都应该使用第一个选项。 - Ignacio Tiraboschi
13
这完全不正确。OCaml 4.04.0及以上版本支持接口文件。.mli 文件是声明模块接口的首选方式。 - Perry

22
通常,使用受限类型进行let绑定值的语法是:
let identifier_or_pattern : constraint = e ...

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

let add : int -> int -> int = fun x y -> ...

这类似于将模块限制为签名所需的语法:
module Mod
  : sig    ... end
  = struct ... end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接