我们如何在 SML 中为 if-then-else 表达式实现 eval 函数案例?
How can we implement an eval function case for the if-then-else expression in SML?
我们如何在 SML 中为 if-then-else 表达式实现 eval 函数案例? SML 中的这个主题对我来说具有挑战性和新意。
datatype exp = ...
| Equal of exp * exp
| If of exp * exp * exp;
datatype value = BVal of bool | ...
fun print (Equal(x,y)) = "(" ^print(x)^ " = " ^print(y)^ ")"
| print (If(x,y,z)) = "if " ^print(x)^ "
then " ^print(y)^ " else " ^print(z)
| ...
fun eval (Equal(e1, e2)) ctx =
let
val (CVal x) = eval e1 ctx
val (CVal y) = eval e2 ctx
in
BVal (round x = round y)
end
| ...
How can we implement an eval function case for the if-then-else expression?
- 确保
CVal
已定义。它看起来应该是 datatype value
的一部分,但它也可以在您省略的代码区域中定义。当您在 Whosebug 上 post 时,请提供一个 minimal, reproducible example,因为太多的猜测会导致无意义的答案。
- 使用模式匹配扩展
eval
函数,以类似的方式处理 If
构造函数,因为它已经支持 Equal
构造函数。
以下内容可能会让您入门:
datatype value = BVal of bool | CVal of int (* replacing "..." *)
fun eval (Equal (e1, e2)) ctx =
let
val (CVal x) = eval e1 ctx
val (CVal y) = eval e2 ctx
in
BVal (round x = round y)
end
| eval (If (cond, e1, e2)) =
let
val ... = eval cond ctx
in
...
end
根据您执行模式匹配的方式,您需要选择 eval e1 ctx
或 eval e2 ctx
作为结果。您可能想在此处查看 case-of 结构。
我们如何在 SML 中为 if-then-else 表达式实现 eval 函数案例? SML 中的这个主题对我来说具有挑战性和新意。
datatype exp = ...
| Equal of exp * exp
| If of exp * exp * exp;
datatype value = BVal of bool | ...
fun print (Equal(x,y)) = "(" ^print(x)^ " = " ^print(y)^ ")"
| print (If(x,y,z)) = "if " ^print(x)^ "
then " ^print(y)^ " else " ^print(z)
| ...
fun eval (Equal(e1, e2)) ctx =
let
val (CVal x) = eval e1 ctx
val (CVal y) = eval e2 ctx
in
BVal (round x = round y)
end
| ...
How can we implement an eval function case for the if-then-else expression?
- 确保
CVal
已定义。它看起来应该是datatype value
的一部分,但它也可以在您省略的代码区域中定义。当您在 Whosebug 上 post 时,请提供一个 minimal, reproducible example,因为太多的猜测会导致无意义的答案。 - 使用模式匹配扩展
eval
函数,以类似的方式处理If
构造函数,因为它已经支持Equal
构造函数。
以下内容可能会让您入门:
datatype value = BVal of bool | CVal of int (* replacing "..." *)
fun eval (Equal (e1, e2)) ctx =
let
val (CVal x) = eval e1 ctx
val (CVal y) = eval e2 ctx
in
BVal (round x = round y)
end
| eval (If (cond, e1, e2)) =
let
val ... = eval cond ctx
in
...
end
根据您执行模式匹配的方式,您需要选择 eval e1 ctx
或 eval e2 ctx
作为结果。您可能想在此处查看 case-of 结构。