Advertisement
Guest User

Untitled

a guest
Jun 28th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.06 KB | None | 0 0
  1. {-# language LambdaCase #-}
  2.  
  3. import Data.String
  4. import Data.HashMap.Strict (HashMap, (!))
  5. import qualified Data.HashMap.Lazy as M
  6.  
  7. data Term = Var !String | !Term :$ !Term | Lam !String !Term deriving (Show)
  8.  
  9. instance IsString Term where
  10. fromString = Var . fromString
  11. infixl 8 :$
  12.  
  13.  
  14. -- NBE
  15. --------------------------------------------------------------------------------
  16.  
  17. data Val = VVar !String | VApp !Val Val | VLam (Val -> Val)
  18.  
  19. eval :: HashMap String Val -> Term -> Val
  20. eval e = \case
  21. Var v -> e ! v
  22. f :$ x -> case (eval e f, eval e x) of
  23. (VLam t, x) -> t x
  24. (f , x) -> VApp f x
  25. Lam v t -> VLam $ \val -> eval (M.insert v val e) t
  26.  
  27.  
  28. -- Eval-apply environment machine
  29. --------------------------------------------------------------------------------
  30.  
  31. type Env = HashMap String Whnf
  32. data Whnf = WVar !String | WApp !Whnf Whnf | WLam !String !Env !Term
  33.  
  34. eval' :: Env -> Term -> Whnf
  35. eval' e = \case
  36. Var v -> e ! v
  37. f :$ x -> case (eval' e f, eval' e x) of
  38. (WLam v e' t, x) -> eval' (M.insert v x e') t
  39. (f , x) -> WApp f x
  40. Lam v t -> WLam v e t
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement