Ocaml抽象Sytnax树
我有一个工作表达式,但是当我尝试使用当前的求值函数求值表达式时,我得到以下错误--“错误:此模式匹配'a*'b类型的值,但需要一个与args类型的值匹配的模式”。你能帮我修一下吗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
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上的一些语法错误我们自己的:-)