2011-12-18 11 views
7

sto passaggio da Haskell a OCaml ma sto avendo alcuni problemi. Ad esempio, ho bisogno di una definizione di tipo per le espressioni regolari. Lo faccio con:OCaml: circolarità tra tipo variante e di definizione di modulo

type re = EmptySet 
    | EmptyWord 
    | Symb of char 
    | Star of re 
    | Conc of re list 
    | Or of (RegExpSet.t * bool) ;; 

Gli elementi all'interno della O sono in un set (RegExpSet), quindi mi definisco la prossima (e anche una funzione di mappa):

module RegExpOrder : Set.OrderedType = 
    struct 
     let compare = Pervasives.compare 
     type t = re 
    end 
module RegExpSet = Set.Make(RegExpOrder)  
module RegExpMap = Map.Make(RegExpOrder) 

Tuttavia, quando lo faccio "ocaml [nome del file]" ottengo:

Error: Unbound module RegExpSet 

nella linea di "O" nella definizione di "re".

Se sostituisco queste definizioni, cioè, se scrivo le definizioni moduli prima le definizioni del tipo ri ovviamente ottengo:

Error: Unbound type constructor re 

nella linea di "tipo t = re".

Come posso risolvere questo? Grazie!

risposta

9

Si può cercare di usare recursive modules. Ad esempio, le seguenti compilazioni:

module rec M : 
sig type re = EmptySet 
    | EmptyWord 
    | Symb of char 
    | Star of re 
    | Conc of re list 
    | Or of (RegExpSet.t * bool) 
end = 
struct 
    type re = EmptySet 
    | EmptyWord 
    | Symb of char 
    | Star of re 
    | Conc of re list 
    | Or of (RegExpSet.t * bool) ;; 
end 

and RegExpOrder : Set.OrderedType = 
    struct 
     let compare = Pervasives.compare 
     type t = M.re 
    end 
and RegExpSet : (Set.S with type elt = M.re) = Set.Make(RegExpOrder) 
+0

Grazie per aver risposto! Ho aggiunto quella definizione all'inizio del mio file. Comunque ora ho un nuovo problema che è quando provo a fare la corrispondenza con gli argomenti di una funzione con elementi di tipo M.re. Ad esempio, questa funzione let if exp = corrisponde exp con \t M.EmptyWord -> M.EmptySet ;; mi dà Errore: nessun impegno costruttore M.EmptyWord Ricardo Almeida – vegetus

+0

L'implementazione di tipo 're' è stato fatto astratto. Prova a rimuovere la firma del modulo 'sig type re end'. Esamina anche i tipi 'private', che permetteranno un livello intermedio di nascondimento; al di fuori del modulo dovrai usare costruttori speciali per ottenere valori di tipo 're', ma puoi comunque eseguire lo schema di corrispondenza. –

+0

@ user1104586 Ho aggiornato la mia risposta per rendere visibili i costruttori di 'M.re'. –

Problemi correlati