Copyright | (c) 2023 Keito Kajitani |
---|---|
License | MIT |
Maintainer | Keito Kajitani <ijaketak@gmail.com> |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
binder is purely functional implementation of Ocaml's bindlib. It follows the style of higher-order abstract syntax, and offers the representation of abstract syntax tree.
Synopsis
- class (Monad m, Ord (Numbering m)) => MonadNumbering m where
- data Var m a
- data Box m a
- class MkFree m a where
- var'Key :: forall m a. Lens' (Var m a) (Numbering m)
- var'Name :: Lens' (Var m a) Text
- var'Box :: Lens' (Var m a) (Box m a)
- nameOf :: Var m a -> Text
- boxVar :: Var m a -> Box m a
- newVar :: forall m a. (MkFree m a, MonadNumbering m) => Text -> m (Var m a)
- isClosed :: Box m a -> Bool
- occur :: MonadNumbering m => Var m a -> Box m b -> Bool
- unbox :: forall m a. Box m a -> a
- box :: MonadNumbering m => a -> Box m a
- apBox :: MonadNumbering m => Box m (a -> b) -> Box m a -> Box m b
- boxApply :: (a -> b) -> Box m a -> Box m b
- boxApply2 :: MonadNumbering m => (a -> b -> c) -> Box m a -> Box m b -> Box m c
- boxApply3 :: MonadNumbering m => (a -> b -> c -> d) -> Box m a -> Box m b -> Box m c -> Box m d
- boxApply4 :: MonadNumbering m => (a -> b -> c -> d -> e) -> Box m a -> Box m b -> Box m c -> Box m d -> Box m e
- boxPair :: MonadNumbering m => Box m a -> Box m b -> Box m (a, b)
- boxTriple :: MonadNumbering m => Box m a -> Box m b -> Box m c -> Box m (a, b, c)
- boxT :: (MonadNumbering m, Traversable t) => t (Box m a) -> Box m (t a)
- data Binder a b
- binder'Name :: forall a b. Lens' (Binder a b) Text
- binder'Body :: forall a b a b. Lens (Binder a b) (Binder a b) (a -> b) (a -> b)
- subst :: Binder a b -> a -> b
- buildBinder :: Var m a -> (a -> b) -> Binder a b
- bind :: (MkFree m a, MonadNumbering m) => Var m a -> Box m b -> Box m (Binder a b)
- unbind :: (MkFree m a, MonadNumbering m) => Binder a b -> m (Var m a, b)
- eqBinder :: (MkFree m a, MonadNumbering m) => (b -> b -> m Bool) -> Binder a b -> Binder a b -> m Bool
- boxBinder :: (MkFree m a, MonadNumbering m) => (b -> m (Box m b)) -> Binder a b -> m (Box m (Binder a b))
Preliminaries
Variable and Box
Representation of variable
for abstract syntax tree type a
with base numbering monad m
.
Representation of under-construction things
having type a
and containing variables.
Instances
MonadNumbering m => Applicative (Box m) Source # | |
Functor (Box m) Source # | |
Variable
newVar :: forall m a. (MkFree m a, MonadNumbering m) => Text -> m (Var m a) Source #
Create a new variable with given name.
occur :: MonadNumbering m => Var m a -> Box m b -> Bool Source #
Check if the variable occurs in the box.
Box
box :: MonadNumbering m => a -> Box m a Source #
boxApply3 :: MonadNumbering m => (a -> b -> c -> d) -> Box m a -> Box m b -> Box m c -> Box m d Source #
boxApply4 :: MonadNumbering m => (a -> b -> c -> d -> e) -> Box m a -> Box m b -> Box m c -> Box m d -> Box m e Source #
boxT :: (MonadNumbering m, Traversable t) => t (Box m a) -> Box m (t a) Source #