【问题标题】:OCaml function to evaluate arithmetic expressions计算算术表达式的 OCaml 函数
【发布时间】:2012-08-15 22:11:03
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 看起来你在寻求很多关于家庭作业的帮助。您需要展示您的尝试,我们不想为您从中受益。对于它的价值,(a) 部分似乎要求使用构造函数 Term、Addition 和 Multiplication 的 OCaml 表达式。
  • 请不要破坏您自己的帖子。当您在此处发布时,即表示您授予 SO 在 CC-by SA 4.0 下分发内容的权利。任何破坏行为都将被撤销。
  • 如果您继续破坏您的问题,它将被版主锁定。

标签: recursion tree expression ocaml


【解决方案1】:

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

Addition (Term 2,Term 3)

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

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

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

其余情况(对于其余构造函数,包括您将为 b 添加的阶乘构造函数的情况)是类似的,您现在应该可以自己完成了。

祝你好运!

【讨论】:

  • @jessefinnneman:不要在评论中说“谢谢”,而是要对答案投赞成票,如果您认为答案完整且最好,请接受一个答案。虽然我在这,但如果你在写作上付出一些努力,人们可能会更愿意回答你的问题:正确的格式、逗号和大写的使用以及更清晰的想法(这可能意味着更短的句子)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2011-01-25
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多