2

我需要表示一组元素...由于这些元素之间存在顺序关系,因此我决定使用格子(而不是列表或地图...)来表示它们,其中函数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

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

4

1 回答 1

1

大多数情况下,实现 1) 将在您创建一些解决方法以编写更短但不太清晰的代码时使用。此外,您正在创建一个中间结构,该结构将在创建后立即进行 GC,因此它的性能不是很好(不知道 ocaml 是否会对此进行优化)。

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

于 2013-07-22T17:44:55.037 回答