我很好奇大于(>)和小于(<)的运算符如何处理OCaml中不是int,float或double的类型。
例如,我能够发现字符串“a”> “b”但是有一些参考列出了所有非数字数据类型的约定。此外,这些运算符如何跨类型工作?例如是“a”>是或是“a”<真?
最后,这些如何在用户定义的数据类型中工作?
谢谢!
答案 0 :(得分:6)
OCaml <
,>
,<=
,>=
运算符仅使用两个相同类型的值,因此表达式"a" > true
无效。但是,它们适用于所有类型(下面有警告)。您可以在Pervasives
模块中找到这些运算符的定义。
这些运算符的顺序仅针对简单值(整数,字符,字符串,字节序列和浮点)定义。在这些情况下,文档说他们给出了“通常的顺序”。
字符串和字节序列的通常排序是字典顺序。对于字符串,案例很重要。
对于复合值,订单仅保证与=
一致,并且是一致的排序。
据我所见,没有为像type abc = A | B | C
这样的简单用户定义类型定义顺序。我没想到会出现这种情况,但这就是我在文档中看到的内容。在实践中,A
,B
,C
等常量构造函数的值将按声明的顺序排序,第一个值最小。
我也没有看到false
和true
之间订单的定义。再次,这是令人惊讶的。实际上,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 ))