ocaml - Ocaml 抽象语法树
问题描述
我有工作表达式,但是当我尝试使用当前的评估函数评估我的表达式时,出现以下错误 - “错误:此模式匹配 '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
。
这是 type 的有效值expr
:
Plus (Const 3, Const 8)
您的eval
函数不处理变量(Var
构造函数)的评估。这只是一个警告,而不是错误,但如果您尝试评估类似Var "abc"
.
你没有说你在谈论这些错误中的哪一个,但我希望这仍然有帮助。
更新
正如讨论.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
andArg2
需要是arg1
and arg2
。所以我个人怀疑测试用例是需要修改的部分。
我不明白关于相互递归定义的部分(尽管我当然知道那些是什么)。一般来说,我会说你最大的困难是问题陈述,而不是你的代码。
推荐阅读
- scala - Scala 函数字面量中的变量定义
- iot - OpenNMS:我能做工业物联网和LTE移动吗
- indexing - 扫描存储桶以查找某些文档时出现 Couchbase 性能问题 - 出现超时异常
- java - 保持输出流打开
- javascript - 如何制作下拉类别列表?
- php - 如何将控制器中的 foreach 放入刀片 laravel 中的表视图中
- github - 使用 github 进行 Spring Cloud 配置
- java - 在 Java 中使用 .equals()、.isEmpty() 和 .length() 检查空字符串
- amazon-web-services - S3 | 对存储桶应用加密但排除其中的文件夹
- html - Content.jsp 显示在一个小的左上角区域,没有充满白色背景的页面。如何设置 CSS?