OCaml运营商如何<和>使用非整数类型?

时间:2015-07-01 03:51:45

标签: operators ocaml comparison-operators

我很好奇大于(>)和小于(<)的运算符如何处理OCaml中不是int,float或double的类型。

例如,我能够发现字符串“a”> “b”但是有一些参考列出了所有非数字数据类型的约定。此外,这些运算符如何跨类型工作?例如是“a”>是或是“a”<真?

最后,这些如何在用户定义的数据类型中工作?

谢谢!

1 个答案:

答案 0 :(得分:6)

OCaml <><=>=运算符仅使用两个相同类型的值,因此表达式"a" > true无效。但是,它们适用于所有类型(下面有警告)。您可以在Pervasives模块中找到这些运算符的定义。

这些运算符的顺序仅针对简单值(整数,字符,字符串,字节序列和浮点)定义。在这些情况下,文档说他们给出了“通常的顺序”。

字符串和字节序列的通常排序是字典顺序。对于字符串,案例很重要。

对于复合值,订单仅保证与=一致,并且是一致的排序。

据我所见,没有为像type abc = A | B | C这样的简单用户定义类型定义顺序。我没想到会出现这种情况,但这就是我在文档中看到的内容。在实践中,ABC等常量构造函数的值将按声明的顺序排序,第一个值最小。

我也没有看到falsetrue之间订单的定义。再次,这是令人惊讶的。实际上,false小于true

值得注意的是,不能保证循环值之间的比较终止。此外,包含函数的值之间的比较可能会引发异常。这些可能导致意想不到的问题,有时甚至是严重问题。

$ ocaml
        OCaml version 4.02.1

# (+) < (+);;
Exception: Invalid_argument "equal: functional value".
# let rec cycle = 1 :: cycle;;
val cycle : int list = [1; <cycle>]
# cycle < cycle;;
(( Does not terminate ))