Ocaml 如何隐藏构造函数?

Ocaml 如何隐藏构造函数?,ocaml,Ocaml,我试图构建一个类型LazyList,但隐藏了LazyList.t的定义。我有以下文件: LazyList.ml type 'a t = | Cell of ('a * 'a t) option Lazy.t ;; let rec from_list l = ...;; let rec from_string s = ...;; let rec from_in_channel c = ...;; let rec to_list l = ...;; LazyList.mli type

我试图构建一个类型
LazyList
,但隐藏了
LazyList.t
的定义。我有以下文件:

LazyList.ml

type 'a t =
    | Cell of ('a * 'a t) option Lazy.t
;;

let rec from_list l = ...;;
let rec from_string s = ...;;
let rec from_in_channel c = ...;;

let rec to_list l = ...;;
LazyList.mli

type 'a t;;

val from_list : 'a list -> 'a t;
val from_string : string -> char t;
val from_in_channel : in_channel -> char t;

val to_list : 'a t -> 'a list;
运行
ocamlc LazyList.mli
时,出现以下错误:

File "LazyList.mli", line 1, characters 9-10:
Error: Syntax error

有什么好处?如果要在LazyList.ml中编写所需的所有方法,是否需要公开构造函数?

这只是一个语法错误。分号不能出现在mli文件中。你也不需要在ML文件中使用这个丑陋的双分号,虽然它不是一个错误。

单个构造函数看起来不太有用,但确实会带来一些开销:考虑完全删除它。我该怎么办?我认为类型需要一个递归的构造函数。
-rectypes
选项允许这样的类型定义。另一种可能是以不同的方式定义类型,比如
type'at=Nil | Cons of('a*'at)Lazy.t
(但是你必须重写你的代码)。哇。现在我觉得自己很笨。谢谢你的帮助!