2012-05-08 41 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