Safe Haskell | None |
---|---|
Language | Haskell2010 |
Abt.Tutorial
- newtype M α = M {}
- runM :: M α -> α
- data Lang ns where
- lam :: Tm Lang (S Z) -> Tm0 Lang
- app :: Tm0 Lang -> Tm0 Lang -> Tm0 Lang
- ax :: Tm0 Lang
- unit :: Tm0 Lang
- pi :: Tm0 Lang -> Tm Lang (S Z) -> Tm0 Lang
- newtype StepT m α = StepT {}
- stepsExhausted :: Applicative m => StepT m α
- step :: Tm0 Lang -> StepT M (Tm0 Lang)
- star :: Monad m => (α -> StepT m α) -> α -> m α
- eval :: Tm0 Lang -> Tm0 Lang
- newtype JudgeT m α = JudgeT {}
- type Ctx = [(Var, Tm0 Lang)]
- raise :: Monad m => String -> JudgeT m α
- checkTy :: Ctx -> Tm0 Lang -> Tm0 Lang -> JudgeT M ()
- inferTy :: Ctx -> Tm0 Lang -> JudgeT M (Tm0 Lang)
- identityTm :: M (Tm0 Lang)
- appTm :: M (Tm0 Lang)
- main :: IO ()
Documentation
We'll start off with a monad in which to manipulate ABTs; we'll need some state for fresh variable generation.
Next, we'll define the operators for a tiny lambda calculus as a datatype indexed by arities.
A monad transformer for small step operational semantics.
stepsExhausted :: Applicative m => StepT m α Source
To indicate that a term is in normal form.
star :: Monad m => (α -> StepT m α) -> α -> m α Source
The reflexive-transitive closure of a small-step operational semantics.
identityTm :: M (Tm0 Lang) Source
λx.x