2012-05-08 78 views
5

我知道OCaml不支持重載。然後,我們可以做些什麼而不是超載?在Ocaml中重載

1)使用多態性代替? 2)賦予不同的功能不同的名字? 3)在不同的模塊中放入同名的函數?

哪一個會工作?

回答

13

這一切都取決於你的意思是超載。有幾種用例,例如:

如果您想在數學表達式中使用通常的中綴操作符名稱,請使用除整數之外的其他操作符:在本地重新綁定操作符;模塊和「本地開放」可以提供幫助。

module I32 = struct 
    open Int32 
    let (+), (-), (*), (/), (!!) = add, sub, mul, div, of_int 
end 

... I32.(x + y * !!2) ... 

如果你想行動是在正在使用的數字類型的類型多態,你需要在抽象的數字等運營商。例如,通用的快速冪函數(一個整數),可以在矩陣等

let rec pow (*) one a = function 
    | 0 -> one 
    | n -> pow (*) (if n mod 2 = 0 then one else one * a) (a * a) (n/2) 

let() = assert (pow (*.) 1. 2. 3 = 8.) 

更普遍的,是的,這個想法是可以用來捕捉你想要的「過載」爲一組什麼操作符(這裏是infix操作符,但是普通名稱很好,通常對於可讀性來說更好),並且通過這些操作的字典進行傳遞和抽象 - 這很像Haskell類型類被編譯到的實際上。

+0

我注意到你在模塊I32中做了'打開Int32',如果你在那裏做了'包含Int32',會有什麼不同呢?在這方面他們基本上是否相同? – aneccodeal

+1

@aneccodeal:那將會非常不同:如果我使用'include',這個'I32'將包含所有'Int32',所以在本地打開'I32'將特別導入'Int32'的所有定義。我不想「打開」大範圍,因爲它可能會影響用戶定義。 – gasche