0

我已经编写了一个数学计算器程序的一部分。我已经完成了程序的解析器,所以当用户将数学表达式键入为字符串时,我已经有办法获得以下类型的相应数据结构:

type expression =
| Term of int
| Addition of expression * expression
| Multiplication of expression * expression
| Subtraction of expression * expression

我现在需要的只是一种评估这些数据结构的方法。

  • (a) 写出数学语句“3*((1 + 4)- 5)”对应的表达式。</li>
  • (b) 扩展 Ocaml 数据类型以包含 Factorial 构造函数,以便它可以处理像“3*((1 + 4)!-5)”这样的表达式。</li>
  • (c) 编写一个 Ocaml 函数 eval,它接受一个数学表达式并返回其(整数)值。例如,它应该返回 0 作为 (a) 部分中表达式的结果。
 # let rec eval expr = ...
 val eval : expression -> int = <fun>

您可能想要编写一个阶乘 Ocaml 函数来帮助使用新的 Factorial 构造函数。

我对a部分感到困惑。这是什么意思let expression = 3*((1 + 4)- 5);

对于 b 部分,我应该遵循模式|Factorial of expression * expression吗?

4

2 回答 2

4

a) 中的意思是您现在可以将数学表达式编写为提供的 datatype 的值expression。例如,构造函数Addition表示加法运算符(通常写为 (+))通过将两个较小的表达式作为操作数来形成一个表达式。因此,例如,数学表达式 2 + 3 可以由 Caml 值表示

Addition (Term 2,Term 3)

现在,观察到阶乘运算符采用一个参数而不是两个参数,您应该能够expression使用阶乘的构造函数来扩展数据类型,如 b) 中所要求的那样。

最后,在 c) 中,为这种表达式类型编写一个求值函数很简单:常量只映射到它们携带的整数值,求加法涉及递归求值加法的操作数,然后将它们相加:

let rec eval = function
  | Term n -> n
  | Addition (l,r) -> eval e1 + eval e2
  | ...

其余情况(对于其余构造函数,包括您将为 b 添加的阶乘构造函数的情况)是类似的,您现在应该能够自己做到这一点。

祝你好运!

于 2012-08-15T22:54:08.123 回答
0

b部分:问题的重点是乘法需要两个数字作为输入,但阶乘只需要一个数字作为输入。

于 2012-08-15T22:34:38.200 回答