Ber*_*rgi 5 comparison ocaml compare
该函数的文档说明了Pervasives.compare这一点
compare x y返回0如果x等于y,一个负整数,如果x小于y,并且如果正整数x大于y.
这表明它可以返回任何负整数或正整数,而不仅仅是-1或1代表更大或更小的整数.但是,这实际发生了吗?
这会使代码编写如下
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.不知道它做了什么.
您自己的答案表明,在当前实现中不能返回任何其他值.不过,我会非常小心地依靠它.只要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)
我想知道为什么不应该直接使用@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),无论如何都可能违反约束。