如何可靠地比较列表的整数值或浮点值



假设我有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。循环结构之间的比较可能不会终止。

如果您需要某个订单,您应该编写自己的比较函数。

相关内容

  • 没有找到相关文章

最新更新