Advertisement
alessandro308

OCAML getElement typeerror

Aug 24th, 2015
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 3.42 KB | None | 0 0
  1. type ide = string;;
  2. type integer = int;;
  3.  
  4. (*Eccezioni*)
  5. exception WrongMatchException;;
  6. exception EmptyEnvException;;
  7. exception TypeErrorException;;
  8. exception UnboundRecordException;;
  9. exception OutOfBoundException;;
  10.  
  11. type exp =
  12.     | Ide of ide (*Identificatore*)
  13.     | Int of int (*Valori Interi*)
  14.     | Bool of int (*Valori Booleani*)
  15.     | Add of exp * exp (*Operatori Matematici*)
  16.     | Sub of exp * exp
  17.     | Mul of exp * exp
  18.     | Eq of exp * exp
  19.     | Leq of exp * exp
  20.     | And of exp * exp (*Operatori Logici*)
  21.     | Or of exp * exp
  22.     | Not of exp
  23.     | Fun of ide * exp (*Funzione con un parametro, non ricorsiva*)
  24.     | IfThenElse of exp * exp * exp (*Classico If Then Else *)
  25.     | LetIn of ide * exp * exp (*Blocco Let*)
  26.     | Function of ide * exp (*Applicazione funzionale Ide(E)*)
  27.     | CreateTuple of ide * exp (*Espressione Tupla*)
  28.     | GetIndex of elts * exp (*Accesso Elemento Tupla*)
  29.     | GetFirstN of exp * integer (* Seleziona elementi Tupla*)
  30.     | TupleEquals of exp * exp (*Confronto tra tuple*)
  31.     | Map of ide * exp (*Applica funzione ad elementi tupla*)
  32. and
  33. (*Elementi di una tupla*)
  34.  elts = exp list
  35. ;;
  36.  
  37.  
  38.     (* the empty environment *)
  39.     (* emptyEnv: 'a -> 'b *)
  40. let emptyEnv = fun x -> raise EmptyEnvException;;
  41. let emptyFunEnv = fun x -> raise EmptyEnvException;;
  42.     (*bind: ('a -> 'b) -> ide -> exp -> (ide -> exp ) *)
  43. let bind env (variable: ide) value = fun y ->
  44.             if variable = y then value else env y;;
  45.            
  46.     (*Funzioni di supporto*)
  47. let rec getElement lista index = match lista with
  48.     | [] -> raise OutOfBoundException
  49.     | primo::elems -> if index = 0 then primo else getElement elems (index-1);;
  50.  
  51. let rec map lista funct = match lista with
  52.     | [] -> []
  53.     | elem::elems -> (funct elem)::(map elems funct);;
  54.  
  55. let rec eval (expression: exp) env funenv =
  56.     match expression with
  57.     | Int i -> i
  58.     | Ide i -> env i
  59.     | Bool i -> (match i with
  60.                 | 0 -> 0
  61.                 | 1 -> 1
  62.                 | _ -> raise TypeErrorException)
  63.     | Add (e1, e2) -> (eval e1 env funenv) + (eval e2 env funenv)
  64.     | Sub (e1, e2) -> (eval e1 env funenv) - (eval e2 env funenv)
  65.     | Mul (e1, e2) -> (eval e1 env funenv) * (eval e2 env funenv)
  66.     | Eq (e1, e2) -> if (eval e1 env funenv) = (eval e2 env funenv) then 1 else 0
  67.     | Leq (e1, e2) -> if (eval e1 env funenv) <= (eval e2 env funenv) then 1 else 0
  68.     | And (e1, e2) -> if eval e1 env funenv = 1 then eval e2 env funenv else 0
  69.     | Or (e1, e2) -> if eval e1 env funenv = 1 then eval e2 env funenv else 0
  70.     | Not (e1) -> if (eval e1 env funenv) = 1 then 0 else 1
  71.     | Fun (funName, arg) -> (*Chiamata di funzione*)
  72.         let value = eval arg env funenv in
  73.                 let (param, body, ambiente) = funenv funName in
  74.                         let env1 = bind env param value in
  75.                             eval body env1 funenv
  76.     | IfThenElse (e1, e2, e3) -> if eval e1 env funenv = 1 then eval e2 env funenv
  77.                                                     else eval e3 env funenv
  78.     | LetIn (id, value, body) -> let value = eval value env funenv in
  79.                                     let env1 = bind env id value in
  80.                                         eval body env1 funenv
  81.     | GetIndex (id, i) -> getElement id (eval i env funenv)
  82.     (*| GetFirstN (exp, i) -> (eval exp env funenv) fst (eval i env funenv) *)
  83.     | TupleEquals (exp1, exp2) -> if (eval exp1 env funenv) = (eval exp2 env funenv) then 1 else 0
  84.     | Map (funx, exp) -> map (eval exp env funenv) (eval exp env funenv)
  85.     | _ -> raise WrongMatchException
  86. ;;
  87.  
  88. (**TEST**)
  89. let simpleAnd = And(Int 1, Int 1);;
  90. let doubleAnd = And(Int 1, And(Int 1, Int 0));;
  91. eval simpleAnd emptyEnv emptyFunEnv;;
  92. eval doubleAnd emptyEnv emptyFunEnv;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement