[英]Ocaml Abstract Sytnax Tree
我有工作表达式,但是当我尝试使用当前的评估函数评估我的表达式时,我收到以下错误 - “错误:此模式匹配类型为 '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"
类的内容,它将导致运行时异常。
你没有说你在谈论这些错误中的哪一个,但我希望这仍然有帮助。
更新
正如 Discussion.ocaml.org 上的 @CraigFe 指出的那样,您在expr
的定义和测试用例之间存在不匹配。 您可以重写expr
的定义,以便测试用例工作,或者您可以重写测试用例,使其适用于您当前的expr
定义。
要匹配测试用例,您需要这样的定义:
type expr2 =
| Const of int
| Plus of { arg1 : expr2; arg2: expr2 }
然后你可以有一个这样的值:
Plus { arg1 = Const 3; arg2 = Const 8 }
但是,在 OCaml 中不能有以大写字母开头的字段名称。 这意味着Arg1
和Arg2
需要是arg1
和arg2
。 所以我个人怀疑测试用例是需要修改的部分。
我不明白关于相互递归定义的部分(尽管我当然知道那些是什么)。 一般来说,我会说你最大的困难在于问题陈述,而不是你的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.