0

类型声明有什么好处:

type xxx
and yyy

超过

type xxx
type yyy

赋予它依赖于另一个的语义?

我正在使用OcamlWin 4.0,代码来自C:\OCaml\lib\hashtbl.ml

  type ('a, 'b) t =
  { mutable size: int;                        (* number of entries *)
    mutable data: ('a, 'b) bucketlist array;  (* the buckets *)
    mutable seed: int;                        (* for randomization *)
    initial_size: int;                        (* initial array size *)
  }

and ('a, 'b) bucketlist =
    Empty
  | Cons of 'a * 'b * ('a, 'b) bucketlist

它编译。当我更改andtype

type ('a, 'b) t =
  { mutable size: int;                        (* number of entries *)
    mutable data: ('a, 'b) bucketlist array;  (* the buckets *)
    mutable seed: int;                        (* for randomization *)
    initial_size: int;                        (* initial array size *)
  }

type ('a, 'b) bucketlist =
    Empty
  | Cons of 'a * 'b * ('a, 'b) bucketlist

也可以编译。

4

2 回答 2

3

and定义相互递归声明时经常使用关键字

鉴于你的例子

type ('a, 'b) t =
    { mutable size: int;                        (* number of entries *)
      mutable data: ('a, 'b) bucketlist array;  (* the buckets *)
      mutable seed: int;                        (* for randomization *)
      initial_size: int;                        (* initial array size *)
    }

type ('a, 'b) bucketlist =
    Empty
  | Cons of 'a * 'b * ('a, 'b) bucketlist

将给出Error: Unbound type constructor bucketlist第 3 行,字符 20-39。但是,使用 and 更改第二种类型将消除错误。

type ('a, 'b) t =
    { mutable size: int;                        (* number of entries *)
      mutable data: ('a, 'b) bucketlist array;  (* the buckets *)
      mutable seed: int;                        (* for randomization *)
      initial_size: int;                        (* initial array size *)
    }

and ('a, 'b) bucketlist =
    Empty
  | Cons of 'a * 'b * ('a, 'b) bucketlist

我想不出为什么它会在这两种情况下为您编译的原因,但是如果您使用解释器并且忘记关闭它,那么它的环境中将有旧的绑定。
也就是说,如果您首先使用and关键字评估了代码,那么您可以继续重新评估代码,而无需bucketlist在环境中定义。

于 2013-01-29T23:42:18.310 回答
2

and需要关键字来表达相互递归的定义。例如,

type t = A | B of u
and  u = C | D of t

and如果您要替换为.将不再编译type。但是,在您的示例中,它的使用是多余的。

于 2013-01-30T04:48:04.583 回答