Advertisement
Guest User

Untitled

a guest
Oct 24th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. {-# LANGUAGE DataKinds #-}
  2. {-# LANGUAGE GADTs #-}
  3. {-# LANGUAGE StandaloneDeriving #-}
  4. {-# LANGUAGE TypeOperators #-}
  5.  
  6. module Typed where
  7.  
  8. import Prelude hiding (Left, Right, fst, snd)
  9.  
  10. data Elem as a where
  11. EZ :: Elem (a:as) a
  12. ES :: Elem as a -> Elem (b:as) a
  13.  
  14. instance Show (Elem as a) where
  15. show EZ = show 0
  16. show (ES x) = show (1 + read (show x))
  17.  
  18. data Expr as a where
  19. Ref :: Elem as a -> Expr as a
  20. Abs :: Expr (a:as) b -> Expr as (a -> b)
  21. App :: Expr as (a -> b) -> Expr as a -> Expr as b
  22. Pair :: Expr as a -> Expr as b -> Expr as (a, b)
  23. Fst :: Expr as (a, b) -> Expr as a
  24. Snd :: Expr as (a, b) -> Expr as b
  25. InL :: Expr as a -> Expr as (Either a b)
  26. InR :: Expr as b -> Expr as (Either a b)
  27. Case :: Expr as (Either a b) -> Expr (a:as) c -> Expr (b:as) c -> Expr as c
  28. Num :: Integer -> Expr as Integer
  29. Bool :: Bool -> Expr as Bool
  30.  
  31. deriving instance Show (Expr as a)
  32.  
  33. data Value a where
  34. Closure :: Env as -> Expr as (a -> b) -> Value (a -> b)
  35. Tuple :: Value a -> Value b -> Value (a, b)
  36. Left :: Value a -> Value (Either a b)
  37. Right :: Value b -> Value (Either a b)
  38. Number :: Integer -> Value Integer
  39. Boolean :: Bool -> Value Bool
  40.  
  41. deriving instance Show (Value a)
  42.  
  43. fst :: Value (a, b) -> Value a
  44. fst (Tuple x _) = x
  45.  
  46. snd :: Value (a, b) -> Value b
  47. snd (Tuple _ x) = x
  48.  
  49. data Env as where
  50. Empty :: Env '[]
  51. Cons :: Value a -> Env as -> Env (a:as)
  52.  
  53. deriving instance Show (Env as)
  54.  
  55. get :: Elem as a -> Env as -> Value a
  56. get EZ (Cons x _) = x
  57. get (ES x) (Cons _ xs) = get x xs
  58.  
  59. eval :: Expr '[] a -> Value a
  60. eval x = go Empty x
  61. where go :: Env as -> Expr as a -> Value a
  62. go env (Ref x) = get x env
  63. go env (Abs x) = Closure env (Abs x)
  64. go env (App x y) = apply (go env x) (go env y)
  65. go env (Pair x y) = Tuple (go env x) (go env y)
  66. go env (Fst x) = fst $ go env x
  67. go env (Snd x) = snd $ go env x
  68. go env (InL x) = Left (go env x)
  69. go env (InR x) = Right (go env x)
  70. go env (Case x left right) =
  71. case (go env x) of
  72. Left x -> go (Cons x env) left
  73. Right x -> go (Cons x env) right
  74. go _ (Num x) = Number x
  75. go _ (Bool x) = Boolean x
  76.  
  77. apply :: Value (a -> b) -> Value a -> Value b
  78. apply (Closure env (Abs body)) x = go (Cons x env) body
  79. apply _ _ = undefined
  80.  
  81. s :: Expr as ((a -> b -> c) -> (a -> b) -> a -> c)
  82. s = Abs (Abs (Abs (App (App (Ref (ES (ES EZ))) (Ref EZ)) (App (Ref (ES EZ)) (Ref EZ)))))
  83.  
  84. k :: Expr as (a -> b -> a)
  85. k = Abs (Abs (Ref (ES EZ)))
  86.  
  87. i :: Expr as (a -> a)
  88. i = Abs (Ref EZ)
  89.  
  90. -- eval $ s `App` k `App` k
  91. -- eval $ s `App` k `App` k `App` Num 10
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement