Sto riscontrando un problema nel correggere un avvertimento che il compilatore OCaml mi fornisce.Soppressione dell'avviso di abbinamento completo in OCaml
Fondamentalmente sto analizzando un'espressione che può essere composta da Bool
, Int
e Float
.
Ho una tabella dei simboli che tiene traccia di tutti i simboli dichiarate con il loro tipo:
type ast_type = Bool | Int | Float
and variables = (string, int*ast_type) Hashtbl.t;
dove int
è l'indice utilizzato in seguito nella matrice di tutte le variabili.
devo poi un tipo concreto che rappresenta il valore in una variabile:
type value =
| BOOL of bool
| INT of int
| FLOAT of float
| UNSET
and var_values = value array
sto cercando di definire il comportamento di un riferimento variabile all'interno di un'espressione booleana in modo da quello che faccio è
- verifica che la variabile è dichiarata
- verifica che la variabile è di tipo bool
per fare questo ho questo codice (s
è il nome della variabile):
| GVar s ->
begin
try
let (i,t) = Hashtbl.find variables s in
if (t != Bool) then
raise (SemanticException (BoolExpected,s))
else
(fun s -> let BOOL v = Array.get var_values i in v)
with
Not_found -> raise (SemanticException (VarUndefined,s))
end
Il problema è che i miei assegni assicurano che l'elemento preso da var_values
sarà di tipo BOOL of bool
ma naturalmente questo vincolo isn' Visto dal compilatore che mi avverte:
Avviso P: questo abbinamento di motivi non è esaustivo. Ecco un esempio di un valore che non è compensata: (FLOAT _ | _ INT | UNSET)
Come faccio a risolvere questo tipo di problemi? Grazie in anticipo
Come parte, è utile dichiarare il tipo "var_values = array valore" se si intende astrarre e lasciare solo il suo nome visibile dall'esterno del modulo. Oltre a questa possibilità, è un alias di tipo inutile che può rendere i messaggi di errore meno leggibili. –