Ocaml을 사용하여 모의 통역사를 구현하고 있습니다. 모의 기능 중 하나는 패턴 일치를 사용하여 구성된 표현을 평가하는 것입니다. 문제는 간단하고 확실하게 고칠 수 있지만, 좀 더 우아한 방법을 찾으려고 노력하고 있습니다. 그래도 여전히 관심이 있다면 읽어보십시오!Ocaml에서 try/with 문을 사용하여 유형을 확인 하시겠습니까?
내 사용자 정의 형식의 코드 조각은 다음과 같습니다
물론type value =
| Val_Int of int
| Val_Bool of bool
type expr =
| Id of string
| Int of int
| Bool of bool
| Plus of expr * expr
| Equal of expr * expr
, 내가 (string * value) list -> expr -> value
의 형태로 이러한 식을 평가하는 기능을 가지고, 함수의 코드 조각은 다음과 같습니다
(* Ignore this helper function if you'd like *)
let rec lookup env x = match env with
| [] -> raise (DeclarationError "Declaration Error")
| (y,v)::env_t -> if x = y then v else lookup env_t x
;;
(* The evaluation function *)
let rec eval_expr env e = match e with
| Id(x) -> lookup env x
| Int(x) -> Val_Int(x)
| Bool(x) -> Val_Bool(x)
| Plus(x,y) -> (try
let Val_Int n1 = eval_expr env x in
let Val_Int n2 = eval_expr env y in
Val_Int (n1 + n2)
with _ -> raise (TypeError "Type Error Plus"))
| Equal(x,y) -> (try
let value n1 = eval_expr env x in
let value n2 = eval_expr env y in
Val_Bool (n1 = n2)
with _ -> raise (TypeError "Type Error Equal"))
;;
나는 어떤 원시 오류 유형을 잡으려고 try/with
문을 사용하여 내 자신의 오류 TypeError
을 던지는거야. 1 + true
과 같은 잘못된 유형 연산에서 내 변수를 보호하기 위해 Val_Int n1
과 같은 다형 변수를 사용하고 있는데, 이는 TypeError
을 반환해야합니다.
문제는 Equals
개입니다. 두 인수가 동일한 유형의 경우 Equals
만 평가되어야한다 (모두 Val_Int
또는 둘 모두 Val_Bool
즉), 및 Equals(Val_Int(0), Val_Bool(false))
같은이 전달되는 경우 TypeError
을 던져. Plus
와
을, 나는 명시 적으로 내 유형을 정의 할 수 있어요 Val_Int
과 같으므로 Plus(Val_Int(0), Val_Bool(false))
과 같은 것으로 match failure
을 던지고 try/with
문에 걸리 겠지만 Val_Int
또는 Val_Bool
일 수있는 Equals
일 수는 없습니다. 즉, Equals(Val_Int(0), Val_Bool(false))
과 같은 것은 오류를 던지는 대신 Val_Bool(false)
을 반환합니다.
|Equal(x,y)->(match (eval_expr env x,eval_expr env y) with
|(Val_Int(a),Val_Int(b)) -> Val_Bool(a = b)
|(Val_Bool(a),Val_Bool(b)) -> Val_Bool(a = b)
|(_,_) -> raise (TypeError "TypeError Equals"))
하지만 난이 일을 더 우아한 방법을 찾으려고 노력 해요 : 내가 좋아하는 뭔가를 한 경우처럼 나는, try/with
대신 match/with
문을 사용하면 내가이 문제를 해결할 수
한 가지 방법이다. 어떤 제안?
를 구성하여 artithmetical (RESP, 부울) 평가자을 수정할 수 있습니다, 'match'는 적절한 해결책입니다. – Bergi
사실 'match'는 적절한 해결책이지만 그는 또 다른 방법을 원했습니다. '모의'는'더미 '와 같은가요? – Lhooq