问题描述
我们如何为 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
| ...
解决方法
我们如何为 if-then-else 表达式实现 eval 函数案例?
- 确保定义了
CVal
。看起来它应该是datatype value
的一部分,但它也可以在您省略的代码区域中定义。当您在 StackOverflow 上发帖时,请提供 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 构造。