use*_*007 8 ocaml overloading ml
我知道OCaml不支持重载.然后,我们可以做些什么才能解决这个问题,而不是超载?
1)使用多态而不是?2)给不同的功能不同的名字?3)将同名函数放在不同的模块中?
哪一个会起作用?
gas*_*che 16
这一切都取决于你重载的意思.有几个用例,例如:
如果你想在数学表达式中使用通常的中缀运算符名称来操作除整数之外的东西:在本地重新绑定你的运算符; 模块和"本地开放"可以帮助解决这个问题.
module I32 = struct
open Int32
let (+), (-), ( * ), (/), (!!) = add, sub, mul, div, of_int
end
... I32.(x + y * !!2) ...
Run Code Online (Sandbox Code Playgroud)
如果希望操作在所使用的数字类型中具有多态性,则需要对这些数字运算符进行抽象.例如,可以在矩阵等上使用的通用快速取幂函数(通过整数).
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.)
Run Code Online (Sandbox Code Playgroud)
更一般地说,是的,我的想法是捕获你想要"重载"的东西作为一组运算符(这里是中缀运算符,但普通名称很好,通常更好的可读性),并传递和抽象这些操作的字典 - - 实际上,就像编译Haskell类型类一样.
| 归档时间: |
|
| 查看次数: |
3467 次 |
| 最近记录: |