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

问题描述

相关函数(不是所有显示的)是

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

根据过去在匹配语句中出现 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,expr)
  | Binop(op,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

解决方法

token val 是 OCaml 中的关键字。您只需要更改为不同的名称。我经常使用 valu