假设我有 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 模块和 pervasive 模块,但找不到任何文档详细说明此函数的工作原理。
有人可以明确证实、补充或反驳我已经推论的内容吗?
最佳答案
对于简单值列表(如整数和字符),多态比较使用“字典顺序”。它的工作原理就像字典中的单词顺序一样。本质上,从列表的开头开始并比较相应的元素,直到它们不同。然后比较取决于两个不同元素的顺序。如果您先到达一个列表的末尾(到目前为止没有差异),则较短的列表会比较长的列表少。如果您同时到达两个列表的末尾(到目前为止没有差异),则列表相等。
遵循同一组规则,字典中“the”出现在“then”之前,“then”出现在“them”之后。您可以使用 OCaml 列表 ['t'; 来验证这一点'H'; 'e']
, ['t'; 'H'; 'e'; 'n']
; ['t'; 'H'; 'e'; 'm']
。
但是,当我仔细研究这一点时,我发现未定义结构化值(如列表、记录等)的 OCaml 多态比较函数。您唯一真正可以信赖的是它是一致的。
Pervasives module 的文档只说了这一点:
These functions coincide with the usual orderings over integers, characters, strings, byte sequences and floating-point numbers, and extend them to a total ordering over all types. The ordering is compatible with ( = ). As in the case of ( = ), mutable structures are compared by contents. Comparison between functional values raises
Invalid_argument
. Comparison between cyclic structures may not terminate.
如果您需要特定的顺序,您应该编写自己的比较函数。
关于list - 如何可靠地比较列表的整数或浮点值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42239914/