2011-07-28 26 views
6

he definido algunos tipos:sobrecarga de funciones en OCaml

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

parece que en OCaml, no podemos definir 2 funciones con el mismo nombre pero con diferentes tipos de argumentos:

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 *) 

Así ¿alguien podría decirme cuál es la alternativa en OCaml para hacer esto? ¿Tenemos que nombrar estas 2 funciones de manera diferente?

+1

Tenga en cuenta que su segunda declaración de 'compare' ocultará la anterior (no hay sobrecarga de funciones en Ocaml). – akoprowski

Respuesta

6

Sí, la solución más fácil es simplemente llamar a las funciones de manera diferente. Permitir que los programas hagan esto complica enormemente el sistema de tipos (no hasta el punto de que no es posible que los expertos diseñen una solución: hasta el punto en que la encontrarían inutilizable cuando lo hacen).

Las soluciones existentes para escribir una sola función compare son el sistema de objetos en OCaml, y las clases de tipos en Haskell (una extensión diferente del mismo sistema de tipo base). Pero es mucho más simple quedarse en el fragmento simple y nombrar sus funciones compare de manera diferente.

+8

Otra alternativa para crear compare_box y compare_table es ajustar cada tipo y comparar la función en su propio módulo. Luego llamarías a Box.compare y Table.compare. – hcarty

+0

Crear módulos separados también es conveniente si planea crear un 'Set' o' Map' del tipo. – nlucaroni