你能帮我完成下一个任务吗? 我应该有一个功能
fun eval (fn : (string * int) list -> expression -> int)
获取元组(variable_name,value)和表达式的列表。该函数使用currying并返回表达式的求值。它应该至少支持表示加法,减法,乘法,整数除法和余数
的运算符+, -, *, /, %
对于下一个数据类型:
datatype expression = Constant of int
| Variable of string
| Operator of string * expression
| Pair of expression list
| List of expression list
任何建议或解释都将不胜感激!
答案 0 :(得分:1)
这是一个骨架:
String line[]={"https://google.com","https://www.facebook.txt"};
String extensionToBlock[]={".com",".swf"};
for (String url:line) {
for (String ext:extensionToBlock) {
if (url.endsWith(ext)){
//url bloc
System.out.println("not valid url :"+url);
break;
}else{
//url ok
System.out.println("valid url :"+url);
//call a function with url ?;
}
}
}
以下是一些想法:
解决问题的方法:将问题分成几个子部分。例如,创建一个在vtable中查找变量的辅助函数是给定的。在单独的辅助函数中处理运算符的好处不那么明显 - 主要是我只是试图避免嵌套 case of of 以便易读。因为数据类型具有太多的灵活性(可以表达,在我看来,无意义的表达),在正确的位置处理这种灵活性似乎也需要在这里进行划分。
如果fun lookup var1 ((var2,value)::rest) = ...
| lookup var1 [] = raise Fail ("Variable " ^ var1 ^ " not found")
fun eval vtable exp =
case exp of
Constant i => i
| Variable v => lookup ...
| Operator (oper, subexp) => evalOp vtable oper subexp
| Pair _ => raise Fail "Pair at unexpected position in syntax tree!"
| List _ => raise Fail "List at unexpected position in syntax tree!"
and evalOp vtable oper exp =
let val operands =
case exp of ... (* calling eval on sub-expressions allowed *) ...
in case oper of
"+" => ...add operands...
| "-" => ...subtract operands...
| ...
end
应该始终包含两个操作数,则可以将此部分写为Pair
,但如果它们有时会缩减为运算符必须使用的值列表一些关联性假设,可能只是val (op1, op2) = case exp of ...
,map eval sub_exps
是在sub_exps
或Pair
中找到的表达式的评估列表。
正如约翰所说,你给出的语法树似乎反映了一些不受欢迎的属性。例如,List
是一对奇特的对。 Pair [Constant 1, Constant 2, Constant 3]
是什么意思?那么Operator ("-", Pair [Constant 1, Constant 2, Constant 3])
呢?当他们同时列出一个列表时,为什么同时拥有Operator ("/", [])
和Pair
? List
什么时候适合?为什么对是合法的表达?他们应该评估什么整数值?
道德:良好的数据类型只有有意义的价值。
可能起作用的替代数据类型:
List
此数据类型也更容易评估,因为要处理的奇数/错误角点案例更少:
datatype expression = Constant of int
| Variable of string
| Operator of string * expression * expression
(* or: | Operator of string * expression list *)
不幸的是,您的语法树需要大量探测无效值。
如果这是作业,请记得在源代码中制作正确的版权归属。 ; - )