Recursion 用于计算加法和减法的OCaml函数

Recursion 用于计算加法和减法的OCaml函数,recursion,ocaml,Recursion,Ocaml,我目前正在尝试编写一个OCaml函数,该函数将计算表达式并返回布尔值。我试着在网上做研究,我能找到的最接近的答案是。然而,我仍然有困难,这导致我问我自己的问题 以下是基本代码: type equation = | True | False | Equal of exp * exp and exp = | Val of int | Add of exp * exp | Sub of exp * exp let rec eval : equation -> bool

我目前正在尝试编写一个OCaml函数,该函数将计算表达式并返回布尔值。我试着在网上做研究,我能找到的最接近的答案是。然而,我仍然有困难,这导致我问我自己的问题

以下是基本代码:

type equation =
  | True
  | False
  | Equal of exp * exp
and exp =
  | Val of int
  | Add of exp * exp
  | Sub of exp * exp

let rec eval : equation -> bool
= fun f ->
  match f with
  | True -> true
  | False -> false
  | Equal (x, y) -> match (x, y) with
                    | (Val a, Val b) -> if (x = y) then true else false
                    | ((Add (Val a, Val b), c) -> eval (Equal (Val (a + b), c))
程序不完整,最后一行对
eval
的递归调用就是我被卡住的地方。我想到的一个具体输入示例是:

eval(相等(添加(添加(Val 1、Val 2、Val 3、Val 6))

这应该评估为
true
,因为这两个
Add
的总和为6,而
Equal
val6
val6
进行比较。我遇到的问题是如何递归调用函数来计算表达式中的第二个
Add
,以便
Add(val2,val2)
首先计算为
val3
,然后第一个
Add
使用
val3
添加
val3
。我现在编写的程序只计算两个
Add
中的一个


有什么我应该考虑或记住的吗?欢迎任何反馈。谢谢。

正如@Amadan提到的,定义一个函数,首先将表达式求值为int
eval\u exp:exp->int
,会更容易。然后,您可以计算tuple
Equal(e1,e2)
中的两个表达式并比较它们(
eval:equation->bool

您也不需要type
等式
中的值True和False,因为您只需从函数返回bool而无需模式匹配。请注意,如果出于某种原因再次将其传递给
eval
函数,则可能需要True和False

type equation =
  Equal of exp * exp
and exp =
  | Val of int
  | Add of exp * exp
  | Sub of exp * exp

let rec eval (e: equation) : bool =
  let rec eval_exp e =
    match e with
    | Val i -> i
    | Add (e1, e2) -> (eval_exp e1) + (eval_exp e2)
    | Sub (e1, e2) -> (eval_exp e1) - (eval_exp e2)
  in
  match e with
  | Equal (e1, e2) ->
      if (eval_exp e1) = (eval_exp e2)
      then true
      else false

为什么不
Equal(x,y)->eval_exp(x)==eval_exp(y)
?同时做这两件事很不舒服,因为你会发现…嘿@Amadan谢谢你的反馈。我也尝试过,但不幸的是,我得到了一个类型错误,上面写着“这是exp类型,但应该是公式类型”;因此,需要两个评估函数。注意,我没有使用
eval
。啊,你说得对。谢谢你的澄清。我试试看,谢谢!我以前没想过把
exp
转换成
int
。你的提示让我解决了这个问题