处理不属于数据类型的变量

Handle variables not in datatype

我希望完成的是将字符串和布尔值传递到列表中。 'switch' 运算符切换输入类型的前两个元素,'and' 运算符切换前两个元素。

但是,如果我想 'and' 一个布尔值和一个字符串,我该如何将错误字符串添加到列表 ("error") 中?此外,SMl 不接受 x::y::xs 我应该放什么,因为我想切换而不考虑类型。

datatype input = Bool_value of bool | String_Value of string | Exp_value of string
datatype bin_op = switch | and

fun helper(switch, x::y::xs) = y::x::stack 
    |   helper(and, Bool_value(x)::Bool_value(y)::xs) = Bool_value(x and y)::xs

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

and是关键字,所以你把bin_op改成了switch | and_opx::y::zs 是完全有效的 sml。在辅助函数的第一行 stack 未定义。最后,"and" 两个布尔值在 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

有不匹配的模式,但我想您要么将它们遗漏了,要么稍后再放入。

听起来您正在为动态类型的文件构建解释器 语。如果那是真的,我会区分抽象语法 你的程序和解释器的错误处理,不管 您是否使用异常或值来指示错误。例如,

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)