可以比较返回除-1,0和1以外的任何内容吗?

Ber*_*rgi 5 comparison ocaml compare

函数文档说明了Pervasives.compare这一点

compare x y返回0如果x等于y,一个负整数,如果x小于y,并且如果正整数x大于y.

这表明它可以返回任何负整数或正整数,而不仅仅是-11代表更大或更小的整数.但是,这实际发生了吗?

这会使代码编写如下

match String.compare key new_key with
  | 1  -> Node (left,                insert new_key right, key)
  | -1 -> Node (insert new_key left, right,                key)
  | _  -> Node (left,                right,                key)
Run Code Online (Sandbox Code Playgroud)

更难(使用when,可能?).

我特别感兴趣String.compare.看看它的实现,它只是转发Pervasives.compare,而后者本身就是使用external.不知道它做了什么.

kne*_*kne 6

您自己的答案表明,在当前实现中不能返回任何其他值.不过,我会非常小心地依靠它.只要compare没有记录为三值,OCaml的未来版本可能会改变这种行为.

[编辑,回答评论]为了避免笨拙的案例区别(如原始问题中暗示的那样),你可以包装compare成一个返回三值类型的函数,如下所示:

type comparison = Less | Equal | More

let my_compare a b = match compare a b with
| 0 -> Equal
| c when c>0 -> More
| _ -> Less
Run Code Online (Sandbox Code Playgroud)


lam*_*y.x 5

我想知道为什么不应该直接使用@kne 提出的包装器。你的代码将变成:

match String.compare key new_key with
  | 0             -> Node (left, right, key)
  | x when x > 0  -> Node (left, insert new_key right, key)
  | _ (* x < 0*)  -> Node (insert new_key left, right, key)
Run Code Online (Sandbox Code Playgroud)

这节省了函数调用,并且并不比 -1 / 0 / 1 方法长很多。除此之外,比较通常由用户提供(参见例如Set.OrderedType),无论如何都可能违反约束。