В OCaml я определил в файле AST, что stmt может быть stmt или stmt List, но при использовании в функции он сообщает об ошибке
Я определил в файле AST, что stmt=|stmt|stmt List. Тогда у меня есть функция с параметром типа stmt, я не могу использовать список stmt? Может кто-нибудь сказать мне, как заставить это работать?
Ошибка при компиляции:
Error: This expression has type Ast.stmt list
but an expression was expected of type Ast.stmt
Ниже мой код для функции:
let rec eval_stmt (stmt:stmt) (ps:proc_state) (env:environment) (store:store) : (stmtEvalRes*proc_state*store) = match stmt with
| PrintInt e ->
let r = eval_expr e ps env store in
print_int r; (Next, ps, store)
| PrintStr s ->
print_string (Str.global_replace (Str.regexp "\\\\n") "\n" s);
(* Escaping characters here because it's not done in the parser *)
(Next, ps, store)
| List (stmt1::stmts) -> eval_stmt stmt1 ps env store;
eval_stmt stmts ps env store;(Next,ps,store)
Ниже мой файл AST:
type stmt = (* Statements in C-flat language *)
Empty
| VarAss of expr * expr
(* Expressions can be statements in themselves. This is most useful when
the expression is a function call. Calls to built-in functions are
just special cases of calls. *)
| Expr of expr
| PrintStr of string (* string is only static! *)
| PrintInt of expr (* expr should be int *)
(* Control Flow *)
| IfThen of cond * stmt
| IfThenElse of cond * stmt * stmt
| Switch of expr * (int * stmt list) list * stmt list
(* Switch (cond, cases, default) *)
| While of cond * stmt
| For of stmt * cond * stmt * stmt
| Break (* used in switch, while and for *)
| Continue (* used in while and for *)
(* nested statements *)
| List of stmt list
;;
1 ответ
Ваше определение stmt
как тип варианта, т. е. конечный набор альтернатив. Одна из альтернатив List
который действительно содержит stmt list
, Но это не значит, что stmt list
тот же тип, что и stmt
, Это означает, что значение List ...
(со списком операторов внутри) имеет тип stmt
,