Recursion 用于计算加法和减法的OCaml函数
我目前正在尝试编写一个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
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
,会更容易。然后,您可以计算tupleEqual(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
。你的提示让我解决了这个问题