8

我知道 OCaml 不支持重载。那么,我们可以做些什么来解决这个问题,而不是重载呢?

1)改用多态性?2)给不同的功能不同的名字?3)把同名的函数放在不同的模块中?

哪一个会起作用?

4

1 回答 1

18

这完全取决于您所说的重载是什么意思。有几个用例,例如:

如果您想在数学表达式中使用通常的中缀运算符名称来操作整数以外的其他内容:在本地重新绑定运算符;模块和“本地开放”可以帮助解决这个问题。

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 类型的类被编译成什么。

于 2012-05-08T13:27:26.190 回答