我们如何在SML中实现if-then-else表达式的eval函数用例



我们如何在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函数用例?

  1. 确保已定义CVal。它看起来应该是datatype value的一部分,但也可以在您省略的代码区域中定义它。当你在StackOverflow上发帖时,请提供一个最小的、可重复的例子,因为猜测太多会导致荒谬的答案
  2. 使用模式匹配扩展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 ctxeval e2 ctx作为结果。您可能想在此处查看构造的情况。

最新更新