Sml 处理不在数据类型中的变量
我希望完成的是将字符串和布尔值传递到列表中。“开关”运算符切换输入类型的前两个元素,“和”运算符和前两个元素 但是,如果我想“和”一个布尔值和一个字符串,我将如何向列表中添加一个错误字符串(“错误”)?另外,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
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)
谢谢你的回复,现在对我来说很有意义。谢谢你的回复,这看起来和我看到的口译员的做法很相似。