Tengo un problema para solucionar una advertencia que el compilador OCaml me proporciona.Suprime la advertencia de coincidencia exhaustiva en OCaml
Básicamente estoy analizando una expresión que puede estar compuesta por Bool
, Int
y Float
.
I tienen una tabla de símbolos que rastrea todos los símbolos declaradas con su tipo:
type ast_type = Bool | Int | Float
and variables = (string, int*ast_type) Hashtbl.t;
donde int
es el índice utilizado más adelante en el conjunto de todas las variables.
que tienen entonces un tipo concreto que representa el valor de una variable:
type value =
| BOOL of bool
| INT of int
| FLOAT of float
| UNSET
and var_values = value array
Estoy tratando de definir el comportamiento de una referencia variable dentro de una expresión booleana así que lo que hago es
- comprobación de que la variable está declarada
- comprobación de que la variable es de tipo bool
hacer esto tengo este código (s
es el nombre de la variable):
| 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
El problema es que mis cheques aseguran que el elemento tomado de var_values
será de tipo BOOL of bool
pero por supuesto esta restricción ISN' t visto por el compilador que me avisa:
Advertencia P: esta coincidencia de patrón no es exhaustiva. Aquí es un ejemplo de un valor que no es igualada: (FLOAT _ | _ INT | DESACTIVADO)
¿Cómo se supone que voy a resolver este tipo de problemas? Gracias de antemano
Como nota aparte, solo es útil declarar el tipo 'var_values = value array' si tiene la intención de abstraerlo y dejar solo su nombre visible desde fuera del módulo. Además de esta posibilidad, es un alias de tipo inútil que puede hacer que los mensajes de error sean menos legibles. –