我需要創建一個函數,在某些情況下生成一個異常,但我需要它使用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