OCaml中的函数重载

时间:2011-07-28 14:14:32

标签: ocaml overloading

我已经定义了一些类型:

type box = Box of int
type table = Table of int
type compare_result = Lt | Eq | Gt

似乎在OCaml中,我们不能定义具有相同名称但不同类型的参数的2个函数:

let compare (a: box) (b: box): compare_result = (...)
let compare (a: table) (b: table): compare_result = (...)

let res_box = compare (Box 1) (Box 2) in (* which is supposed to call the first funciton *) 
let res_table = compare (Table 1) (Table 2) in (* which is supposed to call the second function *)

所以有人能告诉我OCaml的替代方案是什么?我们必须以不同的方式命名这两个函数吗?

1 个答案:

答案 0 :(得分:5)

是的,最简单的解决方案就是以不同的方式调用函数。允许执行此操作的程序使类型系统变得非常复杂(而不是专家无法设计解决方案:在他们这样做时会发现它无法使用)。

用于编写单个函数compare的现有解决方案是OCaml中的对象系统,并且是Haskell中的类型类(对相同基本类型系统的不同扩展)。但是,保持简单片段并以不同方式命名函数compare要简单得多。