【问题标题】:How do the OCaml operators < and > work with non-integer types?OCaml 运算符 < 和 > 如何处理非整数类型?
【发布时间】:2015-09-18 01:47:32
【问题描述】:

我很好奇大于 (>) 和小于 (

例如,我能够发现字符串“a”>“b”,但是否有一些参考列出了所有非数字数据类型的约定。此外,这些运算符如何跨类型工作?例如"a" > true 还是 "a"

最后,这些如何跨用户定义的数据类型工作?

谢谢!

【问题讨论】:

  • ocaml 字符串运算符比较它们的大小写敏感性。
  • and `string a
  • 不需要 C++ 标签。我已将其删除。

标签: operators ocaml comparison-operators


【解决方案1】:

OCaml &lt;&gt;&lt;=&gt;= 运算符仅适用于相同类型的两个值,因此表达式 "a" &gt; true 无效。但是,它们适用于所有类型(以下注意事项)。您可以在Pervasives 模块中找到这些运算符的定义。

这些运算符的顺序仅针对简单值(整数、字符、字符串、字节序列和浮点数)定义。在这些情况下,文档说他们给出“通常的顺序”。

字符串和字节序列的通常排序是字典顺序。对于字符串,大小写很重要。

对于复合值,仅保证顺序与= 一致并且是一致的顺序。

据我所知,没有为简单的用户定义类型(如type abc = A | B | C)定义顺序。我没想到会是这种情况,但这就是我在文档中看到的。在实践中,ABC等常量构造函数的值将按照声明的顺序排列,第一个值最小。

我也没有看到falsetrue 之间的顺序定义。同样,这令人惊讶。在实践中,false 小于 true

值得注意的是,循环值之间的比较不保证会终止。此外,包含函数的值之间的比较可能会引发异常。这些可能会导致意想不到的问题,有时甚至是严重的问题。

$ ocaml
        OCaml version 4.02.1

# (+) < (+);;
Exception: Invalid_argument "equal: functional value".
# let rec cycle = 1 :: cycle;;
val cycle : int list = [1; <cycle>]
# cycle < cycle;;
(( Does not terminate ))

【讨论】:

  • 另外,常量构造器比非常量构造器小,并且它们按照它们的声明顺序排列。元组也有字典顺序。数组似乎按大小排序,然后按字典顺序排序。
  • 这些是真实的,但没有记录。所以理论上它们可以随着 OCaml 的下一个版本而改变。
  • 同样未记录,列表按字典顺序排列。虽然这个结果可能只是因为将常量空列表构造函数排序在非常量 cons 构造函数之前,然后将 cons 的数据按字典顺序排列为元组。
  • 在像 OCaml 这样试图尽可能避免运行时意外的语言中,拥有未记录的排序似乎是有问题的。我很惊讶 OCaml 在这种情况下不只是抛出异常。无论如何,多态数学运算符在 OCaml 中都是非常奇怪的东西。
  • 什么情况下抛出异常?
猜你喜欢
  • 1970-01-01
  • 2017-12-28
  • 2012-12-03
  • 2018-09-14
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多