我们如何在 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?

  1. 确保 CVal 已定义。它看起来应该是 datatype value 的一部分,但它也可以在您省略的代码区域中定义。当您在 Whosebug 上 post 时,请提供一个 minimal, reproducible example,因为太多的猜测会导致无意义的答案。
  2. 使用模式匹配扩展 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 ctxeval e2 ctx 作为结果。您可能想在此处查看 case-of 结构。