尽管类型匹配正确,OCaml 编译器在匹配语句期间抛出语法错误

OCaml compiler throws syntax error during match statement despite proper type matching

相关函数(未显示所有内容)是

let rec eval_expr env e = match e with
  | Value(value) -> value
  | ID(var) -> lookup(env, var)
  | Fun(var,expr) -> Closure(env, var, expr)
  | Not(expr) -> let val = eval_expr env expr in begin match val with
      | Bool(a) -> Bool(not a)
      | _ -> raise (TypeError ("Expected type bool")) end
  | Binop(op, expr, expr2) -> begin match op with ...

但是,编译器抛出以下错误:

       | Not(expr) -> let val = eval_expr env expr in begin match val with
                          ^^^
Error: Syntax error

根据过去在 match 语句中出现 OCaml 错误的经验,如果您 100% 确信给定行没有错误,则问题很可能出在较早的行中。但是,我将这一行移到了最开始,这样代码看起来像

let rec eval_expr env e = match e with
  | Not(expr) -> let val = eval_expr env expr in begin match val with
      | Bool(a) -> Bool(not a)
      | _ -> raise (TypeError ("Expected type bool")) end
  | Value(value) -> value
  | ID(var) -> lookup(env, var)
  | Fun(var,expr) -> Closure(env, var, expr)
  | Binop(op, expr, expr2) -> begin match op with ...

仍然出现同样的错误。所以错误就在这一行,它可能是什么?如果有帮助,以下是类型:

type expr =
  | Value of value
  | ID of var
  | Fun of var * expr
  | Not of expr
  | Binop of op * expr * expr
  | If of expr * expr * expr
  | FunctionCall of expr * expr
  | Let of var * bool * expr * expr

type value =
  | Int of int
  | Bool of bool
  | String of string
  | Closure of environment * var * expr

令牌 val 是 OCaml 中的关键字。您只需要更改为其他名称即可。我经常使用 valu.