变体的结构比较

时间:2013-06-14 20:36:24

标签: compare ocaml

我想处理整数线的限制。 我希望Pervasives.compare对待RightInfinity>所有 x Point x ,以及LeftInfinity的倒数。

ocaml REPL:

# 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 ()]

"The perils of polymorphic compare"

  

首先通过标签比较变体,然后,如果标签相等,则递归地降级到内容。

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

1 个答案:

答案 0 :(得分:3)

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

请注意,扩展标准库(如电池或核心)提供辅助功能以提升所有常见数据结构的比较,以帮助您将特定于域的比较扩展到包含open_pt的任何类型。

编辑:请注意,可以依赖于此,因为非常量构造函数的排序为specified in the OCaml/C interface。不过,我认为这不是一个好主意 - 下次如果你需要在你的仿函数参数类型中加入闭包怎么办?