Ocaml抽象Sytnax树

Ocaml抽象Sytnax树,ocaml,abstract-syntax-tree,software-design,ocamlbuild,Ocaml,Abstract Syntax Tree,Software Design,Ocamlbuild,我有一个工作表达式,但是当我尝试使用当前的求值函数求值表达式时,我得到以下错误--“错误:此模式匹配'a*'b类型的值,但需要一个与args类型的值匹配的模式”。你能帮我修一下吗 type expr = Const of int | Var of string | Plus of args | Mult of args | Minus of args | Div of args

我有一个工作表达式,但是当我尝试使用当前的求值函数求值表达式时,我得到以下错误--“错误:此模式匹配'a*'b类型的值,但需要一个与args类型的值匹配的模式”。你能帮我修一下吗

type expr = Const of int 
          | Var of string
          | Plus of args
          | Mult of args
          | Minus of args
          | Div of args
              
and args = {arg1:expr; arg2:expr};; 

let rec eval = function
  | Const c -> c
  | Plus (f, g) -> eval f + eval g
  | Minus(f, g) -> eval f - eval g
  | Mult(f, g) -> eval f * eval g
  | Div(f, g) -> eval f / eval g 
;;


像您声明的
Plus
这样的构造函数接受括号中的参数。您似乎正在使用适合于记录类型的语法(带大括号和字段名)。但是在
expr
的定义中没有记录类型

以下是
expr
类型的有效值:

Plus (Const 3, Const 8)
您的
eval
函数不处理变量的求值(
Var
构造函数)。这只是一个警告,不是一个错误,但如果您尝试评估类似
Var“abc”
的内容,它将导致运行时异常

你没有说你在说这些错误中的哪一个,但我希望这是有帮助的

更新

正如discuse.ocaml.org上的@CraigFe所指出的那样,
expr
的定义与测试用例之间存在不匹配。您可以重写
expr
的定义以使测试用例工作,也可以重写测试用例以使其与当前的
expr
定义工作

为了匹配测试用例,您需要这样的定义:

type expr2 =
    | Const of int
    | Plus of { arg1 : expr2; arg2: expr2 }
Plus { arg1 = Const 3; arg2 = Const 8 }
然后您可以得到如下值:

type expr2 =
    | Const of int
    | Plus of { arg1 : expr2; arg2: expr2 }
Plus { arg1 = Const 3; arg2 = Const 8 }
但是,在OCaml中,字段名不能以大写字母开头。这意味着
Arg1
Arg2
需要是
Arg1
Arg2
。所以我个人怀疑测试用例是需要修改的部分


我不理解关于相互递归定义的部分(尽管我当然知道它们是什么)。一般来说,我会说你最大的困难在于问题陈述,而不是你的代码。

这里已经回答了@mva你已经在这里收到了答案,我根据你的建议再次实现了它,如下类型expr=| Const of int | Plus of(arg1:expr;arg2:expr)(*e1+e2*)减去of(arg1:expr;arg2:expr)并将测试用例更改为如下加上{arg1=(Mult{arg1=Const 2;arg2=Var“x”);arg2=(Mult{arg1=Const 3;arg2=(减去{arg1=Var“y”;arg2=Const 1})};;但由于参数之间的“;”而出现语法错误。您在此处给出的代码是错误的,因为它使用括号而不是大括号。但是,在注释中阅读此处的代码实际上是不可能的。如果确实遇到问题,您可以更新原始问题。但您应该愿意解决y上的一些语法错误我们自己的:-)