在Haskell中,明确声明函数的类型签名被认为是很好的做法,尽管它可以(通常)被推断出来。看起来这在OCaml中甚至是不可能的,例如,OCaml显式类型签名
val add : int -> int -> int ;;
给了我一个错误。 (虽然我可以让type
模块,这些模块只给签名。)
- 我是正确的,这是不可能的OCaml中怎么办?
- 如果是这样,为什么? OCaml的类型系统似乎与Haskell不同。
在Haskell中,明确声明函数的类型签名被认为是很好的做法,尽管它可以(通常)被推断出来。看起来这在OCaml中甚至是不可能的,例如,OCaml显式类型签名
val add : int -> int -> int ;;
给了我一个错误。 (虽然我可以让type
模块,这些模块只给签名。)
OCaml有指定类型的方法,它们可以在线完成:
let intEq (x : int) (y : int) : bool = ...
或者可以将它们放置在一个接口文件,因为你做了:
val intEq : int -> int -> bool
我相信后者是首选,因为它更清楚地将规范(类型)与实现(代码)分开。
林一般情况下,语法let
-bind值与约束类型:
let val : constraint = e ...
应用到的功能,你可以指定签名如下:
let add : int -> int -> int = fun x y -> ...
这类似于将模块约束为签名所需的语法:
module Mod
: sig ... end
= struct ... end
后一个选项不再是有效的选项。至少OCaml 4.04.0不支持它。每个人都应该使用第一个选项。 – 2017-11-03 20:40:32