Advertisement
Guest User

Untitled

a guest
Dec 4th, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- a dynamically-typed term language
  2.  
  3. data Term = Occ Var
  4.           | Use Prim
  5.           | Lit Integer
  6.           | App Term Term
  7.           | Abs Var  Term
  8.           | Rec Var  Term
  9.  
  10. type Var  = String
  11. type Prim = String
  12.  
  13.  
  14. -- a domain of values, including functions
  15.  
  16. data Value = Num  Integer
  17.            | Bool Bool
  18.            | Fun (Value -> Value)
  19.  
  20. instance Show Value where
  21.   show (Num  n) = show n
  22.   show (Bool b) = show b
  23.   show (Fun  _) = ""
  24.  
  25. prjFun (Fun f) = f
  26. prjFun  _      = error "bad function value"
  27.  
  28. prjNum (Num n) = n
  29. prjNum  _      = error "bad numeric value"
  30.  
  31. prjBool (Bool b) = b
  32. prjBool  _       = error "bad boolean value"
  33.  
  34. binOp inj f = Fun (\i -> (Fun (\j -> inj (f (prjNum i) (prjNum j)))))
  35.  
  36.  
  37. -- environments mapping variables to values
  38.  
  39. type Env = [(Var, Value)]
  40.  
  41. getval x env =  case lookup x env of
  42.                   Just v  -> v
  43.                   Nothing -> error ("no value for " ++ x)
  44.  
  45.  
  46. -- an environment-based evaluation function
  47.  
  48. eval env (Occ x) = getval x env
  49. eval env (Use c) = getval c prims
  50. eval env (Lit k) = Num k
  51. eval env (App m n) = prjFun (eval env m) (eval env n)
  52. eval env (Abs x m) = Fun  (\v -> eval ((x,v) : env) m)
  53. eval env (Rec x m) = f where f = eval ((x,f) : env) m
  54.  
  55.  
  56. -- a (fixed) "environment" of language primitives
  57.  
  58. times = binOp Num  (*)
  59. minus = binOp Num  (-)
  60. equal = binOp Bool (==)
  61. cond  = Fun (\b -> Fun (\x -> Fun (\y -> if (prjBool b) then x else y)))
  62.  
  63. prims = [ ("*", times), ("-", minus), ("==", equal), ("if", cond) ]
  64.  
  65.  
  66. -- a term representing factorial and a "wrapper" for evaluation
  67.  
  68. facTerm = Rec "f" (Abs "n"
  69.               (App (App (App (Use "if")
  70.                    (App (App (Use "==") (Occ "n")) (Lit 0))) (Lit 1))
  71.                    (App (App (Use "*")  (Occ "n"))
  72.                         (App (Occ "f")  
  73.                              (App (App (Use "-") (Occ "n")) (Lit 1))))))
  74.  
  75. fac n = prjNum (eval [] (App facTerm (Lit n)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement