假设我有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模块和普及模块,但我找不到任何文档,详细说明了这个函数是如何工作的。
有人可以明确地确认,添加或反驳我已推断的内容吗?
答案 0 :(得分:4)
对于简单值列表(如整数和字符),多态比较使用“词典顺序”。它的工作方式类似于字典中的单词顺序。本质上,从列表的开头开始,比较相应的元素,直到它们不同为止。然后比较取决于两个不同元素的顺序。如果您在另一个列表之前到达一个列表的末尾(在该点之前没有差异),则较短的列表小于较长的列表。如果您同时到达两个列表的末尾(到目前为止没有差异),则列表相同。
遵循同一套规则,“the”出现在字典中的“then”之前,“then”出现在“them”之后。您可以使用OCaml列表['t'; 'h'; 'e']
,['t'; 'h'; 'e'; 'n']
来验证这一点; ['t'; 'h'; 'e'; 'm']
。
然而,当我仔细研究过这个问题时,我发现没有定义结构化值(如列表,记录等)的OCaml多态比较函数。你唯一可以指望的是它是一致的。
Pervasives module的文档只说明了这一点:
这些函数与整数,字符,字符串,字节序列和浮点数的通常排序一致,并将它们扩展为所有类型的总排序。排序与(=)兼容。与(=)的情况一样,通过内容比较可变结构。功能值之间的比较提高了
Invalid_argument
。循环结构之间的比较可能不会终止。
如果您需要某个订单,您应该编写自己的比较功能。