2011-05-14 88 views
20

在Haskell中,明确声明函数的类型签名被认为是很好的做法,尽管它可以(通常)被推断出来。看起来这在OCaml中甚至是不可能的,例如,OCaml显式类型签名

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

给了我一个错误。 (虽然我可以让type模块,这些模块只给签名。)

  1. 我是正确的,这是不可能的OCaml中怎么办?
  2. 如果是这样,为什么? OCaml的类型系统似乎与Haskell不同。

回答

30

OCaml有指定类型的方法,它们可以在线完成:

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

或者可以将它们放置在一个接口文件,因为你做了:

val intEq : int -> int -> bool 

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


参考OCaml for Haskellers

+0

后一个选项不再是有效的选项。至少OCaml 4.04.0不支持它。每个人都应该使用第一个选项。 – 2017-11-03 20:40:32

11

林一般情况下,语法let -bind值与约束类型:

let val : constraint = e ... 

应用到的功能,你可以指定签名如下:

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

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

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