Advertisement
Guest User

Untitled

a guest
Sep 18th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.94 KB | None | 0 0
  1. -- Lambda calculus interpreter example.
  2.  
  3. import qualified Data.Map.Lazy as Map
  4.  
  5. data Val = Num Integer | Fun (Val -> Val) | Wrong
  6. data Term = Cons Integer | Var String | Lam String Term | App Term Term | Add Term Term
  7. type Env = Map.Map String Val
  8.  
  9. add :: Val -> Val -> Val
  10. add (Num x) (Num y) = Num (x+y)
  11. add _ _ = Wrong
  12.  
  13. apply :: Val -> Val -> Val
  14. apply (Fun f) v = f v
  15. apply _ _ = Wrong
  16.  
  17. instance Show Val where
  18. show (Num x) = show x
  19. show (Fun f) = "function"
  20. show Wrong = "Wrong"
  21.  
  22. interp :: Term -> Env -> Val
  23. interp (Cons x) e = Num x
  24. interp (Var s) e = Map.findWithDefault Wrong s e -- Equivalent to:
  25. -- interp (Var s) e = maybe Wrong id (Map.lookup s e)
  26. interp (Lam s t) e = Fun (\v -> interp t (Map.insert s v e))
  27. interp (App f t) e = apply (interp f e) (interp t e)
  28. interp (Add a b) e = add (interp a e) (interp b e)
  29.  
  30. expr = App (Lam "x" (Add (Var "x") (Var "x"))) (Add (Cons 10) (Cons 11))
  31. res = interp expr Map.empty
  32.  
  33. main = putStrLn (show res)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement