我们如何在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上发帖时,请提供一个最小的、可重复的例子,因为猜测太多会导致荒谬的答案 - 使用模式匹配扩展
eval
函数,以类似于它已经支持Equal
构造函数的方式处理If
构造函数
下面是一些可能让你开始的东西:
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
作为结果。您可能想在此处查看构造的情况。