处理不属于数据类型的变量
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_op
。 x::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)
我希望完成的是将字符串和布尔值传递到列表中。 '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_op
。 x::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)