У меня возникла проблема с исправлением предупреждения, которое мне предоставляет компилятор OCaml.
В основном я разбираю выражение, которое может быть составлено Bool
, Int
и Float
.
У меня есть таблица символов, которая отслеживает все символы, объявленные с их типом:
type ast_type = Bool | Int | Float
and variables = (string, int*ast_type) Hashtbl.t;
где Int
- это индекс, используемый позже в массиве всех переменных.
У меня есть конкретный тип, представляющий значение в переменной:
type value =
| BOOL of bool
| INT of int
| FLOAT of float
| UNSET
and var_values = value array
Я пытаюсь определить поведение ссылки на переменную внутри логического выражения, так что я делаю
- проверьте, что переменная объявлена
- убедитесь, что переменная имеет тип bool
для этого у меня есть этот код (s
- это имя переменной):
| 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
Проблема в том, что мои проверки гарантируют, что элемент, взятый из var_values
, будет иметь тип BOOL of bool
, но, конечно, это ограничение не видно компилятору, который предупреждает меня:
Предупреждение P: это сопоставление шаблонов не является исчерпывающим. Ниже приведен пример значения, которое не соответствует: (FLOAT _ | INT_ | UNSET)
Как я могу решить такие проблемы? Спасибо заранее