处理非数据类型的变量

时间:2017-03-07 21:32:35

标签: sml smlnj

我希望实现的是将字符串和布尔值传递到列表中。 '开关'操作员切换输入类型的前两个元素,'和'运算符和前两个元素。

但是,如果我想要'和'如何将错误字符串添加到列表中("错误")布尔值和字符串?此外,SMl不接受update()我应该放什么,因为我想切换而不管类型。

x::y::xs

任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:3)

and是关键字,因此您将bin_op更改为switch | and_opx::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)