我已经定义了一些类型:
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的替代方案是什么?我们必须以不同的方式命名这两个函数吗?
答案 0 :(得分:5)
是的,最简单的解决方案就是以不同的方式调用函数。允许执行此操作的程序使类型系统变得非常复杂(而不是专家无法设计解决方案:在他们这样做时会发现它无法使用)。
用于编写单个函数compare
的现有解决方案是OCaml中的对象系统,并且是Haskell中的类型类(对相同基本类型系统的不同扩展)。但是,保持简单片段并以不同方式命名函数compare
要简单得多。