我需要表示一组元素......由于这些元素之间存在顺序关系,我决定使用晶格(而不是列表或地图...)来表示它们,其中函数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
有谁能告诉我哪种实施更传统,实践更有效?
答案 0 :(得分:1)
大多数情况下,实现1)将被用作第二个您正在创建一些解决方法来编写更短但不太清晰的代码。此外,您正在创建一个中间结构,它将在创建后立即进行GCed,因此它不是非常高效(不知道ocaml是否会优化它)。
如果你想要对象,OCaml中有这个功能:http://caml.inria.fr/pub/docs/manual-ocaml/manual005.html。