Sml 处理不在数据类型中的变量

Sml 处理不在数据类型中的变量,sml,smlnj,Sml,Smlnj,我希望完成的是将字符串和布尔值传递到列表中。“开关”运算符切换输入类型的前两个元素,“和”运算符和前两个元素 但是,如果我想“和”一个布尔值和一个字符串,我将如何向列表中添加一个错误字符串(“错误”)?另外,SMl不接受x::y::xs我应该放什么,因为我想切换,而不考虑类型 datatype input = Bool_value of bool | String_Value of string | Exp_value of string datatype bin_op = switch | a

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

但是,如果我想“和”一个布尔值和一个字符串,我将如何向列表中添加一个错误字符串(“错误”)?另外,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

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

是一个关键字,因此您可以将
bin_op
更改为
开关|和_op
x::y::zs
是完全有效的sml。在助手函数的第一行中,
堆栈
未定义。最后,sml中的关键字to“and”是
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)

谢谢你的回复,现在对我来说很有意义。谢谢你的回复,这看起来和我看到的口译员的做法很相似。