2017-02-15 46 views
2

假設我有int列表[1; 2; 3][4; 3; 5],其中每個是數字中的一個數字。如何可靠地比較列表的整數或浮點值?

在OCaml的周圍打我看到:
[1; 2; 3] > [4; 3; 5];;評估爲false
[1; 2; 3] < [4; 3; 5];;計算結果爲true

不同長度的名單...
[4; 5] > [1;2;3][4; 5] > [1;9;3] 評估爲TRUE,這是奇怪的。

它看起來像比較每個單獨的元素,如果一對不滿足不等式,則返回false,但是如果列表長度不相同,它只會比較它可以比較和忽略的相應元素其餘的部分。

但是,我檢查列表模塊和普及模塊,我找不到任何文檔指定該功能如何工作。

有人可以斷然確認,添加或反駁我已經推斷出的內容嗎?

回答

4

有關簡單值(如整數和字符)的列表,多態比較使用「詞典順序」。它的工作方式與字典中的單詞順序一樣。實質上,從列表的開始處開始並比較相應的元素,直到它們不同。然後比較取決於兩個不同元素的順序。如果您先於另一個列表的末尾(在此之前沒有差異),則較短的列表少於較長的列表。如果您同時到達兩個列表的末尾(到目前爲止沒有差異),則列表是相同的。

遵循這一套規則,「the」出現在詞典的「then」之前,「then」出現在「them」之後。你可以使用OCaml列表['t'; 'h'; 'e']['t'; 'h'; 'e'; 'n']來驗證這個; ['t'; 'h'; 'e'; 'm']

但是,當我仔細研究這一點時,我發現結構化值(如列表,記錄等)的OCaml多態比較函數未定義。你唯一能指望的是它是一致的。

Pervasives module的文件說,只有這個:

這些功能用在整數,字符,字符串,字節序列和浮點數通常的排序一致,並擴展到全序在所有類型。該順序與(=)兼容。與(=)的情況一樣,可變結構按內容進行比較。功能值之間的比較引起Invalid_argument。循環結構之間的比較可能不會終止。

如果您需要特定的順序,您應該編寫自己的比較函數。