OCaml中的重叠匹配语句

OCaml中的重叠匹配语句,ocaml,Ocaml,我目前正在做家庭作业。本质上,这是符号数学的一个非常基本的版本。下面的代码片段工作得非常好 let rec eval exp (vars:(string * int) list) = match exp with | Int n -> n | Plus (a, b) -> (eval a vars) + (eval b vars) (* ... more match statements ... *) 例如,如果我输入“eval(Plus(int3)(int

我目前正在做家庭作业。本质上,这是符号数学的一个非常基本的版本。下面的代码片段工作得非常好

let rec eval exp (vars:(string * int) list) = match exp with
    | Int n -> n
    | Plus (a, b) -> (eval a vars) + (eval b vars)
    (* ... more match statements ... *)
例如,如果我输入“eval(Plus(int3)(int5))[]”,它会正确地返回8。然而,当我试图添加一个“let”表达式时,它给出了一个错误。下面是我修改的eval函数的一个片段:

(* either returns Some value or None *)
let rec findVar key l = ...

let rec eval exp (vars:(string * int) list) = match exp with
    | Id id -> match (findVar id vars) with
        | Some value -> value
        | None -> raise (Failure ("Unknown variable " ^ id))
    | Int n -> n
    | Plus (a, b) -> (eval a vars) + (eval b vars)
    (* ... more match statements ... *)

(* raises "Error: The variant type option has no constructor Int" *)
我认为原因是编译器将代码视为:

let rec eval exp (vars:(string * int) list) = match exp with
    | Id id -> match (findVar id vars) with
        | Some value -> value
        | None -> raise (Failure ("Unknown variable " ^ id))
        | Int n -> n
        | Plus (a, b) -> (eval a vars) + (eval b vars)
        (* ... more match statements ... *)
如果我的直觉是正确的,这就是错误,我该如何修复它


如果我的错误还有另一个原因,那是什么?

您应该用paren(或它们的语法等价物
begin/end
)分隔内部匹配,或者将代码分解为单独的帮助函数。我当然更喜欢后者

let rec eval exp (vars : (string * int) list) = match exp with
    | Id id -> eval_var vars id
    | Int n -> n
    | Plus (a, b) -> (eval a vars) + (eval b vars)
    (* ... more match statements ... *)
 and eval_var vars id = match findVar id vars with
    | Some v -> ...

见[此处][1];谷歌的第一个答案。[1] :如果您是正确的,则必须用parens或begin-end包装内部匹配表达式。