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

标签 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 模块和 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/

相关文章:

excel - 比较 Excel VBA 中的两列(大于/小于或等于)

javascript - Node.getAttribute 的运算符计算不一致

java - 从数组创建列表 - 3 种方法哪一种更好

java - 在 if 语句的方法中比较数组列表的元素

scala - Scala 中对 List 的某些序列进行打乱

java - 如何比较2个Maps Java的值

php - "[]"运算符(operator)的名字是什么?

scala - Scala 的 += 在 Int 的上下文中定义在哪里?

list - 递归地从 LISP 中的列表中获取数据

c - 将结构用于链表与将它们用于点类型变量