模式与Oz中的记录匹配

时间:2018-07-15 15:13:15

标签: emacs pattern-matching records oz mozart

我在解决如何通过模式匹配来利用Oz中的记录元素时遇到麻烦。下面是我的代码

declare
fun {Eval X E}
case X
of int(N) then N
   [] var(X) then E.X
   [] mul(X Y) then X*Y
   [] add(X Y) then X+Y
   end
   end
end

{Eval add(var(a) mul(int(3) var(b))) env(a:2 b:4)}

这是我必须利用的输入,var(a)应该从输入中的env记录返回2(而var(b)返回4),我只是无法弄清楚什么。 / p>

1 个答案:

答案 0 :(得分:0)

在您的代码中,只要您未达到数字或var,就需要递归调用Eval。尝试以下方法:

declare
fun {Eval Node Env}
   if {IsNumber Node} then Node
   else
      case Node
      of var(X) then Env.X
      [] mul(X Y) then {Eval X Env} * {Eval Y Env}
      [] add(X Y) then {Eval X Env} + {Eval Y Env}
      end
   end
end

此外,Oz要求将函数的返回值绑定到变量,因此请尝试以下操作:

declare
Ans = {Eval add(var(a) mul(3 var(b))) env(a:2 b:4)}

然后您可以使用浏览器查看Ans,以验证代码是否正确。