2012-04-12 11 views
14

Necesito un mapa OCaml con las claves del tipo int entonces estoy usando Map.Make para crear una. Sin embargo, parece que el standard modules 'sólo' proporcionan módulos como Big_int, Int32, Int64 y Nativeint que requieren conversiones. Así que tengo que hacer cosas como:OCaml map of int keys :: where is the 'simple' int module to use with the Map.Make functor?

module IntMap = Map.Make(Int32) 
let a_map = IntMap.add (Int32.of_int 0) "zero" IntMap.empty ;; 

... lo que yo preferiría evitar o definir mi propia tonta módulo Int no tratar con simples int literales o valores sin necesidad de funciones de conversión:

module Int = struct      
    type t = int            
    let compare x y = if x < y then -1 else if x > y then 1 else 0 end ;; 
module IntMap = Map.Make(Int) 
let a_map = IntMap.add 0 "zero" IntMap.empty ;; 

¿Me falta algo obvio aquí?

+4

Simplemente use 'Pervasives.compare'. – Ptival

Respuesta

24

La forma más sencilla de tener un mapa int es hacer lo siguiente:

module IntMap = Map.Make(struct type t = int let compare = compare end) 
+0

Probablemente prefiera agregar una anotación de tipo a la función de comparación por razones de eficiencia: 'módulo en línea IntMap = Map.Make (tipo de estructura t = int permite comparar: int -> int -> int = comparar final)' –

+0

@PierreChambart ¿Tiene un caso de uso donde esto hace la diferencia? Ambos códigos lambda generados son similares a mí. – Thomas

+0

Efectivamente, no sé por qué, pero no puedo hacer que el compilador se especialice comparar como compare_int en este caso. –

7

No creo que te falte nada, no hay un módulo estándar para esto. Creo que el módulo BatInt de OCaml Batteries Included hace lo que quiere.

(Editado para añadir: es verdad, yo mismo utilice el método sugerido por Thomas!)