OCaml显式类型签名

时间:2011-05-14 22:26:03

标签: syntax types ocaml type-inference

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

val add : int -> int -> int ;;

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

  1. 我是否认为在OCaml中无法做到这一点?
  2. 如果是这样,为什么? OCaml的类型系统似乎与Haskell完全不同。

2 个答案:

答案 0 :(得分:43)

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

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

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

val intEq : int -> int -> bool

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


参考OCaml for Haskellers

答案 1 :(得分:16)

我很通用,let的语法 - 用约束类型绑定一个值是:

let val : constraint = e ...

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

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

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

module Mod
  : sig    ... end
  = struct ... end