在晶格中实现具有多个属性的对象

时间:2013-07-22 14:24:55

标签: types ocaml record

我需要表示一组元素......由于这些元素之间存在顺序关系,我决定使用晶格(而不是列表或地图...)来表示它们,其中函数included用于检查顺序。

每个元素都有几个表示其属性的属性。

1)实现非常正常如下:

module m = struct
  type t =
    | C0 | C1 | C2 ...

  let get_att0 (x: t) : string =
    | C0-> "C0"
    | C0-> "C1"
    | C0-> "C2"

  let get_att1 (x: t) : int =
    | C0-> 1
    | C0-> 2
    | C0-> 3

  let get_att2 (x: t) : bool =
    | C0-> true
    | C0-> false
    | C0-> true

  let included (x0: t) (x1: t) : bool =
    ...

end

2)实现使用内部类型record

module m = struct
  type t =
    | C0 | C1 | C2 ...

  type record =
    { att0: string; att1: int; att2: bool ... }

  let get_record (x: t) : record =
    | C0 -> { att0 = "C0"; att1 = 1; att2 = true ... }
    | C1 -> { att0 = "C1"; att1 = 2; att2 = false ... }
    | C2 -> { att0 = "C2"; att1 = 3; att2 = true ... }

  let get_att0 (x: t) : string =
    (get_record x).att0

  let get_att1 (x: t) : int =
    (get_record x).att1

  let get_att2 (x: t) : bool =
    (get_record x).att2

  let included (x0: t) (x1: t) : bool =
    ...

end

有谁能告诉我哪种实施更传统,实践更有效?

1 个答案:

答案 0 :(得分:1)

大多数情况下,实现1)将被用作第二个您正在创建一些解决方法来编写更短但不太清晰的代码。此外,您正在创建一个中间结构,它将在创建后立即进行GCed,因此它不是非常高效(不知道ocaml是否会优化它)。

如果你想要对象,OCaml中有这个功能:http://caml.inria.fr/pub/docs/manual-ocaml/manual005.html