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

时间:2017-02-15 02:59:02

标签: list compare operators ocaml

假设我有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模块和普及模块,但我找不到任何文档,详细说明了这个函数是如何工作的。

有人可以明确地确认,添加或反驳我已推断的内容吗?

1 个答案:

答案 0 :(得分:4)

对于简单值列表(如整数和字符),多态比较使用“词典顺序”。它的工作方式类似于字典中的单词顺序。本质上,从列表的开头开始,比较相应的元素,直到它们不同为止。然后比较取决于两个不同元素的顺序。如果您在另一个列表之前到达一个列表的末尾(在该点之前没有差异),则较短的列表小于较长的列表。如果您同时到达两个列表的末尾(到目前为止没有差异),则列表相同。

遵循同一套规则,“the”出现在字典中的“then”之前,“then”出现在“them”之后。您可以使用OCaml列表['t'; 'h'; 'e']['t'; 'h'; 'e'; 'n']来验证这一点; ['t'; 'h'; 'e'; 'm']

然而,当我仔细研究过这个问题时,我发现没有定义结构化值(如列表,记录等)的OCaml多态比较函数。你唯一可以指望的是它是一致的。

Pervasives module的文档只说明了这一点:

  

这些函数与整数,字符,字符串,字节序列和浮点数的通常排序一致,并将它们扩展为所有类型的总排序。排序与(=)兼容。与(=)的情况一样,通过内容比较可变结构。功能值之间的比较提高了Invalid_argument。循环结构之间的比较可能不会终止。

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