我们如何为 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 上发帖时,请提供 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 构造。