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!
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
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. –
@ user1104586 Ho aggiornato la mia risposta per rendere visibili i costruttori di 'M.re'. –