2011-11-18 78 views
2

我想寫一個函數來檢查類型相等,忽略實例變量(不知道如果這是SML正確的術語)。優選地,該功能可以在多種數據類型上操作。SML自定義數據類型相等沒有polyEqual

所以,如果我有:

數據類型d = A |整數B

myEqual A AmyEqual (B 1) (B 1)myEqual (B 1) (B 2)都會返回true,myEqual A (B 1)將返回false。

我的第一個想法是實現它像fun myEqual a b = a = b;。但是,這比較了兩個變量的實例變量,這不是我想要的,所以myEqual (B 1) (B 2)將返回false。

我知道,這可能在這種情況下,通過使用模式匹配像

fun myEqual (B _) (B _) = true 
    | myEqual A A = true 
    | myEqual _ _ = false; 

但對於這個特定的數據類型,這隻能實現。

在SML中是否有任何操作只檢查類型相等,而不檢查實例變量?

回答

4

首先,datatype D = A | B of int;只是一種有兩個分支的類型。所以你比較不同分支的不同形式。我認爲你必須分解數據類型才能編寫這樣的比較函數。因此,爲每個數據類型編寫一個myEqual函數是很自然的。第二,如果你想談論兩個獨立的數據類型,那麼這種比較沒有意義。由於SML是靜態且強大的輸入,因此您可以在編譯時瞭解每個變量的具體類型。

+2

或總之,編號:) –

+0

SML做出了比這更強有力的保證。在編譯時你總是知道每個表達式的類型。 –