我知道OCaml不支持重载。然后,我们可以做些什么来解决这个问题而不是超载?
1)使用多态? 2)给不同的功能不同的名字? 3)将同名函数放在不同的模块中?
哪一个会起作用?
答案 0 :(得分:15)
这一切都取决于你重载的含义。有几种用例,例如:
如果你想在数学表达式中使用通常的中缀运算符名称来操作除整数之外的东西:在本地重新绑定你的运算符;模块和“本地开放”可以帮助解决这个问题。
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.)
更一般地说,是的,我的想法是捕获你想要“重载”的东西作为一组运算符(这里是中缀运算符,但普通名称很好,通常更好的可读性),并传递和抽象的字典那些操作 - 实际上就像编译Haskell类型类一样。