3

我想处理整数行的限制。我想对所有xPervasives.compare处理RightInfinity> Point x,对.LeftInfinity

ocamlREPL 中:

# type open_pt = LeftInfinity | Point of int | RightInfinity
  ;;
# List.sort Pervasives.compare [LeftInfinity; Point 0; Point 1; RightInfinity]
  ;;
- : open_pt list = [LeftInfinity; RightInfinity; Point 0; Point 1]

# type open_pt = LeftInfinity | Point of int | RightInfinity of unit
  ;;
# List.sort Pervasives.compare [LeftInfinity; Point 0; Point 1; RightInfinity ()]
  ;;
- : open_pt list = [LeftInfinity; Point 0; Point 1; RightInfinity ()]

“多态比较的危险”

变体首先通过它们的标签进行比较,然后,如果标签相等,则递归地递减到内容。

可以依赖类型声明中变体出现的顺序与标签的顺序之间的任何关系吗?

4

1 回答 1

3

不,你不应该依赖它。您应该定义自己的比较函数。当然,这意味着您必须通过数据结构来提升它(以便能够比较 的列表open_pt),但是当您需要特定于域的比较功能时,这是安全的做法。

请注意,Batteries 或 Core 等扩展标准库提供了辅助函数来提升所有常见数据结构的比较,以帮助您将特定领域的比较扩展到包含open_pt.

编辑:请注意,您可以依赖它,因为非常量构造函数的顺序是在 OCaml/C interface 中指定的。不过,我认为这不是一个好主意——如果下次您需要将闭包放在仿函数参数类型中怎么办?

于 2013-06-14T21:03:23.053 回答