我正在學習多態和SML。我有點不確定如何處理元素的總和,同時保持函數多態。SML NJ - 多態自定義列表類型和總結元素
說,如果我有這樣的定義...
datatype 'a customList = nothing | customL of 'a * 'a customList
這個列表...
val a = customL(2, customL(1, customL(3, nothing)))
我想我需要使用(OP +),因爲多態處理,但我不能讓這些工作...
fun addElements (op +) nothing = 0
| addElements (op +) (customL(x, nothing) = x
| addElements (op +) (customL(x, xs)) = x + addElements xs
我也認爲處理「沒有」可能會混淆類型,因爲我們二?
任何人都可以幫助得到這個工作?
更新
我想我更近一點,但我不明白爲什麼我得到一個錯誤......
exception EmptyList
fun addElements (op +) nothing = raise EmptyList
| addElements (op +) (customL(x, nothing)) = x
| addElements (op +) (customL(x, xs)) = let val rest_of_list = addElements (op +) xs
in
(op +) (x, rest_of_list)
end
目前尚不清楚你在做什麼。 SML不支持運算符重載,並且「通用」不是在SML中使用得很多的詞(除了涉及簽名和函數的一些相當先進的領域)。 「多態」用於更多。你似乎想寫一種'fold'來爲你的自定義列表工作,你應該可以這樣做,但是'(op +)'是一個函數,可以被加入到你的函數中,而不是很難 - 接入定義。如果將它硬連接到定義中,那麼它只適用於「ints」或「reals」(但不是兩者)。 –
對不起 - 我將泛型修正爲多態。我想要的是能夠總結列表的元素,但支持整數或實數。我知道,默認情況下,默認情況下,將類型視爲int,除非我傳入(op +)。硬連線是什麼意思?我希望列表能夠與customL(1,customL(2或customL(1.2,custom)(2.2 - 或者是一個整數列表或者一個實數列表)一起工作 – cpd1
在SML中不可能寫一個函數'f' 'f(1,2)= 3'和'f(1.0,2.0)= 3.0' - 但你似乎想做一些可以寫這樣的函數 –