Перегрузка функции в OCaml - PullRequest
8 голосов
/ 28 июля 2011

Я определил некоторые типы:

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 Ответ

6 голосов
/ 28 июля 2011

Да, самое простое решение - просто вызывать функции по-другому. Разрешение программам, которые делают это, значительно усложняет систему типов (не до такой степени, что эксперты не могут разработать решение: до такой степени, что вы найдете его непригодным, когда они это сделают).

Существующими решениями для написания одной функции compare являются объектная система в OCaml и классы типов в Haskell (другое расширение той же системы базовых типов). Но гораздо проще остаться в простом фрагменте и назвать свои функции compare по-другому.

...