我需要创建一个函数,在某些情况下生成一个异常,但我需要它使用try catch产生一个特定的错误。 它使用的功能:Ocaml例外与尝试捕获
let lookup (x,evn) = match listAssoc(x,evn) with
|Some Int v ->Int v
| None -> raise (MLFailure "variable not found")
;;
let arithmetic (x,y,z) = match (x,y,z) with
| (Int a, Int b, Plus)-> Int (a+b)
| (Int a, Int b,Minus) -> Int (a-b)
| (Int a, Int b, Mul)-> Int (a*b)
| (Int a, Int b, Div)-> Int (a/b)
;;
这是函数:
let errorlookup (x,evn) = match listAssoc(x,evn) with
|Some Int v ->Int v
| None -> raise (Nano.MLFailure "variable not found %s" x)
;;
let rec eval (evn,e) = match e with
| Const a -> Int a
| Var x-> (lookup (x,evn))
| Bin(expr1, Plus, expr2) -> arithmetic(eval(evn,expr1),eval(evn,expr2),Plus)
|Bin(expr1, Minus,expr2) -> arithmetic(eval(evn,expr1),eval(evn,expr2),Minus)
|Bin(expr1, Mul, expr2) -> arithmetic(eval(evn,expr1),eval(evn,expr2),Mul)
| Bin(expr1, Div, expr2) -> arithmetic(eval(evn,expr1),eval(evn,expr2),Div)
;;
我需要确保的是,在瓦尔X的情况下,当查找结果是无我需要打印一个异常
eval (evn, Var "p");;
Exception: MLFailure "variable not bound: p".
eval评估当前环境的表达式 ex。
let evn = [("z1",Int 0);("x",Int 1);("y",Int 2);("z",Int 3);("z1",Int 4)];;
val evn : (string * Nano.value) list =
[("z1", Int 0); ("x", Int 1); ("y", Int 2); ("z", Int 3); ("z1", Int 4)]
我为Bin和Val和Expr制作了类型,但是这些都与此无关。
我需要根据查找结果引发异常,但不会引发查找异常。有人建议使用try catch,但林不知道这将如何工作ocaml和这一点。这是由TA 查找给出的提示应该抛出以下异常:
加薪(MLFailure “未找到”)
而EVAL应该抛出下列之一:
的eval(EVN,无功“P “);;
例外:MLFailure“variable not bound:p”。
看来你必须在这里做异常处理。您可以使用
试用 | - >
要捕捉的语法&处理eval内的异常。
这是什么问题?您是否尝试过Google或OCaml手册? – antron