2012-04-12 6 views
14

Ho bisogno di una mappa OCaml con le chiavi del tipo int così sto usando Map.Make per crearne uno. Tuttavia, sembra che l'standard modules 'unica' forniscono moduli come Big_int, Int32, Int64 e nativeint che richiedono conversioni. Quindi devo fare le cose come:Mappa OCaml di chiavi int: dove è il modulo int '' semplice 'da utilizzare con il functor Map.Make?

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

... che avrei preferito evitare o definire la mia sciocca modulo Int non trattare con semplici int letterali o valori senza la necessità di funzioni di conversione:

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 ;; 

Mi manca qualcosa di ovvio qui?

+4

Basta usare 'Pervasives.compare'. – Ptival

risposta

24

Il modo più semplice per avere una mappa int è quello di effettuare le seguenti operazioni:

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

Probabilmente preferiresti aggiungere un'annotazione di tipo alla funzione di confronto per motivi di efficienza: modulo inline 'IntMap = Map.Make (tipo struct t = int let compare: int -> int -> int = compare end)' –

+0

@PierreChambart Hai un caso d'uso in cui questo fa la differenza? Entrambi i codici lambda generati sono simili a me. – Thomas

+0

In effetti, non so perché, ma in questo caso non riesco a far confrontare il compilatore da specializzare come compare_int. –

7

Non penso che manchi qualcosa, non esiste un modulo standard per questo. Credo che il modulo BatInt di OCaml Batteries Included fa quello che vuoi.

(A cura di aggiungere: è vero, io stesso utilizzare il metodo suggerito da Thomas!)

Problemi correlati