我希望实现的是将字符串和布尔值传递到列表中。 '开关'操作员切换输入类型的前两个元素,'和'运算符和前两个元素。
但是,如果我想要'和'如何将错误字符串添加到列表中("错误")布尔值和字符串?此外,SMl不接受update()
我应该放什么,因为我想切换而不管类型。
x::y::xs
任何帮助将不胜感激,谢谢。
答案 0 :(得分:3)
and
是关键字,因此您将bin_op
更改为switch | and_op
。 x::y::zs
完全有效。在辅助函数的第一行中,未定义stack
函数。最后,sml中“和”两个布尔值的关键字是andalso
。
以下是编译的代码:
datatype input = Bool_value of bool | String_Value of string | Exp_value of string
datatype bin_op = switch | and_op
fun helper(switch, x::y::xs) = y::x::xs
| helper(and_op, Bool_value(x)::Bool_value(y)::xs) = Bool_value(x andalso y)::xs
有无与伦比的模式,但我认为你要么将它们遗弃,要么将它们放在后面。
答案 1 :(得分:1)
听起来你正在为动态类型构建解释器 语言。如果这是真的,我会区分抽象语法 您的程序和解释器的错误处理,无论如何 是否使用异常或值来指示错误。例如,
datatype value = Int of int
| Bool of bool
| String of string
datatype exp = Plus of Exp * Exp
| And of Exp * Exp
| Concat of Exp * Exp
| Literal of value
exception TypeError of value * value
fun eval (Plus (e1, e2)) = (case (eval e1, eval e2) of
(Int i, Int j) => Int (i+j)
| bogus => raise TypeError bogus)
| eval (And (e1, e2)) = (case eval e1 of
Bool a => if a
then ...
else ...
| bogus => ...)
| eval (Concat (e1, e2)) = (case (eval e1, eval e2) of
(String s, String t) => String (s^t)
| bogus => raise TypeError bogus)