簡體   English   中英

比較所有類型的工作?

[英]Does compare work for all types?

讓我們考慮一個類型t和兩個變量x,y的類型t

呼叫compare xy對任何類型t都有效嗎? 我找不到任何反例。

多態比較函數通過遞歸地探索值的結構,提供OCaml值的ad-hoc總排序,用於定義由polymorphic =運算符測試的結構相等性。

按照設計,它不是由@antron觀察到的函數和閉包定義的。 定義的遞歸性質意味着結構相等性不是在包含函數或閉包的值上定義的。 這種遞歸性質也意味着比較函數沒有在遞歸值上定義,如@antron所提到的那樣。

結構相等,因此比較函數和比較運算符,不了解結構不變量,也不能用於比較(溫和)高級數據結構,如集合,映射,HashTbls等。 如果需要比較這些結構,則必須編寫專用函數,這就是Set和Map定義這樣一個函數的原因。

在定義自己的結構時,一個好的經驗法則是區分

  • 具體類型,僅根據基本類型和其他具體類型定義。 具體類型不應該用於處理期望一些不變量的結構,因為很容易創建這種類型的任意值來破壞這些不變量。 對於這些類型,多態比較函數和運算符是合適的。

  • 抽象類型,隱藏其具體定義。 對於這些類型,最好提供專門的比較功能。 混合庫定義了一個比較mixin ,可用於從專用比較函數的實現中派生比較運算符。 其用途在README中說明。

它不適用於函數類型:

# 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM