比较所有类型的工作?

mar*_*trz 7 ocaml

让我们考虑一个类型t和两个x,y类型的变量t.

电话compare x y会对任何类型有效t吗?我找不到任何反例.

Mic*_*ald 8

多态比较函数通过递归地探索值的结构,提供OCaml值的ad-hoc总排序,用于定义由polymorphic =运算符测试的结构相等性.

按照设计,它不是由@antron观察到的函数和闭包定义的.定义的递归性质意味着结构相等性不是在包含函数或闭包的值上定义的.这种递归性质也意味着比较函数没有在递归值上定义,如@antron所提到的那样.

结构相等,因此比较函数和比较运算符,不了解结构不变量,也不能用于比较(温和)高级数据结构,如集合,映射,HashTbls等.如果需要比较这些结构,则必须编写专用函数,这就是Set和Map定义这样一个函数的原因.

在定义自己的结构时,一个好的经验法则是区分

  • 具体类型,仅根据基本类型和其他具体类型定义.具体类型不应该用于处理期望一些不变量的结构,因为很容易创建这种类型的任意值来破坏这些不变量.对于这些类型,多态比较函数和运算符是合适的.

  • 抽象类型,隐藏其具体定义.对于这些类型,最好提供专门的比较功能.该混合物库定义了一个比较混入,可用于从一个专门的实施派生比较运算符比较功能.其用途在README中说明.


ant*_*ron 6

它不适用于函数类型:

# compare (fun x -> x) (fun x -> x);;
Exception: Invalid_argument "equal: functional value".
Run Code Online (Sandbox Code Playgroud)

同样,它(通常)不适用于其值可以包含函数的其他类型:

# type t = A | B of (int -> int);;
type t = A | B of (int -> int)
# compare A A;;
- : int = 0
# compare (B (fun x -> x)) A;;
- : int = 1
# compare (B (fun x -> x)) (B (fun x -> x));;
Exception: Invalid_argument "equal: functional value".
Run Code Online (Sandbox Code Playgroud)

它也(通常)不适用于递归:

# type t = {self : t};;
type t = { self : t; }
# let rec v = {self = v};;
val v : t = {self = <cycle>}
# let rec v' = {self = v'};;
val v' : t = {self = <cycle>}
# compare v v;;
- : int = 0
# compare v v';;
(* Does not terminate. *)
Run Code Online (Sandbox Code Playgroud)

这些案件中还列出文档进行comparePervasives.

  • 对于可以具有不同表示的值,多态"compare"和"="也不起作用,例如由"Set"或"Map"的应用产生的类型. (4认同)