[英]Does compare work for all types?
讓我們考慮一個類型t
和兩個變量x,y
的類型t
。
呼叫compare xy
對任何類型t
都有效嗎? 我找不到任何反例。
多態比較函數通過遞歸地探索值的結構,提供OCaml值的ad-hoc總排序,用於定義由polymorphic =運算符測試的結構相等性。
按照設計,它不是由@antron觀察到的函數和閉包定義的。 定義的遞歸性質意味着結構相等性不是在包含函數或閉包的值上定義的。 這種遞歸性質也意味着比較函數沒有在遞歸值上定義,如@antron所提到的那樣。
結構相等,因此比較函數和比較運算符,不了解結構不變量,也不能用於比較(溫和)高級數據結構,如集合,映射,HashTbls等。 如果需要比較這些結構,則必須編寫專用函數,這就是Set和Map定義這樣一個函數的原因。
在定義自己的結構時,一個好的經驗法則是區分
它不適用於函數類型:
# compare (fun x -> x) (fun x -> x);;
Exception: Invalid_argument "equal: functional value".
同樣,它(通常)不適用於其值可以包含函數的其他類型:
# 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".
它也(通常)不適用於遞歸值 :
# 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. *)
這些案例也列在Pervasives
compare
文檔中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.