【问题标题】:How to reliably compare the integer or float values of a list?如何可靠地比较列表的整数或浮点值?
【发布时间】:2017-02-15 02:59:02
【问题描述】:

假设我有 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 模块,但找不到任何说明该函数具体如何工作的文档。

有人可以断然确认、补充或反驳我已经推断的内容吗?

【问题讨论】:

    标签: list compare operators ocaml


    【解决方案1】:

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

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

    但是,当我仔细研究这一点时,我发现没有定义结构化值(如列表、记录等)的 OCaml 多态比较函数。唯一值得信赖的是它是一致的。

    Pervasives module 的文档只这么说:

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

    如果你需要特定的顺序,你应该编写自己的比较函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2011-04-19
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多