我写了一部分数学计算器程序 . 我已经完成了程序的解析器,所以当用户输入数学表达式作为字符串时,我已经有办法获得以下类型的相应数据结构:
type expression =
| Term of int
| Addition of expression * expression
| Multiplication of expression * expression
| Subtraction of expression * expression
我现在需要的是评估这些数据结构的方法 .
(a)编写对应于数学语句“3 *((1 4) - 5)的表达式 . ”(b)扩展Ocaml数据类型以包含因子构造函数,以便它可以处理像“3 (() 1 4)!-5) . “(c)编写一个Ocaml函数eval,它采用数学表达式并返回其(整数)值 . 例如,它应该返回0作为部分(a)中的表达式的结果 . #let rec eval expr = ... val eval:expression - > int =您可能希望编写一个因子Ocaml函数来帮助使用新的Factorial构造函数 .
我对第一部分感到困惑 . 这是不是意味着 let expression = 3*((1 + 4)- 5);;
?
对于b部分,我应该遵循模式 |Factorial of expression * expression
吗?
3 回答
a)的含义是您现在可以将数学表达式写为提供的数据类型
expression
的值 . 例如,构造函数Addition
表示加法运算符(通常写为())通过将两个较小的表达式作为操作数来形成表达式 . 因此,例如,数学表达式2 3可以由Caml值表示现在,观察阶乘运算符采用一个参数而不是两个参数,您应该能够使用b)中提出的因子的构造函数扩展数据类型
expression
.最后,在c)中,为这种表达式类型编写求值函数很简单:常量只映射到它们所携带的整数值,并且评估加法包括递归计算加法的操作数,然后将它们相加:
其余的情况(对于其余的构造函数,包括你将为b添加的阶乘的构造函数),是类似的,你现在应该能够自己做 .
祝好运!
b部分:问题的关键在于乘法将两个数字作为输入,但是factorial只需要一个数字作为输入 .
这是我与我的profesor解决的答案我认为我发布解决方案以防其他人突然解决这个问题 .
(a)写出对应于数学陈述“3 _((1 4)?? 5)的表达式 . ”
(b)扩展Ocaml数据类型以包含Factorial构造函数,以便它可以处理像“3 _((1 4)!?? 5”这样的表达式 . “
(c)编写一个Ocaml函数eval,它采用数学表达式并返回其(整数)值 . 例如,它应该返回0作为部分(a)中的表达式的结果 . 您可能希望编写一个因子Ocaml函数来帮助使用新的Factorial构造函数 .