В 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,

Другие вопросы по тегам