假设我有int列表[1; 2; 3]
和[4; 3; 5]
,其中每个列表都是一个数字中的一个数字。
在OCaml上玩游戏时,我看到:[1; 2; 3] > [4; 3; 5];;
的求值结果为false
,
而[1; 2; 3] < [4; 3; 5];;
的求值结果是true
。
有不同长度的列表[4; 5] > [1;2;3]
和[4; 5] > [1;9;3]
评估为TRUE
,这很奇怪。
它看起来像是在比较每个单独的元素,如果其中一对不满足不等式,则返回false
,但如果列表的长度不相同,则只比较可以比较的相应元素,忽略其余元素
但是,我检查了List模块和普适模块,找不到任何具体说明该函数如何工作的文档。
有人能明确地证实、补充或反驳我已经推断出的内容吗?
对于简单值(如整数和字符)的列表,多态比较使用"字典顺序"。它的工作原理类似于字典中单词的顺序。本质上,从列表的开头开始,比较相应的元素,直到它们不同。然后,比较取决于两个不同元素的顺序。如果您先到达一个列表的末尾,然后到达另一个列表(到目前为止没有差异),则较短的列表小于较长的列表。如果同时到达两个列表的末尾(到目前为止没有差异),则列表是相等的。
按照同样的规则,"the"出现在字典中的"then"之前,"then"出现在"them"之后。您可以使用OCaml列表['t'; 'h'; 'e']
、['t'; 'h'; 'e'; 'n']
来验证这一点;['t'; 'h'; 'e'; 'm']
。
然而,当我仔细研究这一点时,我发现没有定义结构化值(如列表、记录等)的OCaml多态比较函数。你唯一能指望的是它是一致的。
Pervasives模块的文档只说明了这一点:
这些函数与整数、字符、字符串、字节序列和浮点数的常规排序一致,并将它们扩展到所有类型的总排序。该排序与(=)兼容。与(=)的情况一样,可变结构通过内容进行比较。函数值之间的比较提高了
Invalid_argument
。循环结构之间的比较可能不会终止。
如果您需要某个订单,您应该编写自己的比较函数。