binder-0.1: Variable binding for abstract syntax tree
Copyright(c) 2023 Keito Kajitani
LicenseMIT
MaintainerKeito Kajitani <ijaketak@gmail.com>
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Binder

Description

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

Preliminaries

class (Monad m, Ord (Numbering m)) => MonadNumbering m where Source #

Numbering monad.

Associated Types

type Numbering m :: Type Source #

Methods

numbering :: m (Numbering m) Source #

Variable and Box

data Var m a Source #

Representation of variable for abstract syntax tree type a with base numbering monad m.

Instances

Instances details
Show (Var m a) Source # 
Instance details

Defined in Data.Binder

Methods

showsPrec :: Int -> Var m a -> ShowS #

show :: Var m a -> String #

showList :: [Var m a] -> ShowS #

MonadNumbering m => Eq (Var m a) Source # 
Instance details

Defined in Data.Binder

Methods

(==) :: Var m a -> Var m a -> Bool #

(/=) :: Var m a -> Var m a -> Bool #

MonadNumbering m => Ord (Var m a) Source # 
Instance details

Defined in Data.Binder

Methods

compare :: Var m a -> Var m a -> Ordering #

(<) :: Var m a -> Var m a -> Bool #

(<=) :: Var m a -> Var m a -> Bool #

(>) :: Var m a -> Var m a -> Bool #

(>=) :: Var m a -> Var m a -> Bool #

max :: Var m a -> Var m a -> Var m a #

min :: Var m a -> Var m a -> Var m a #

data Box m a Source #

Representation of under-construction things having type a and containing variables.

Instances

Instances details
MonadNumbering m => Applicative (Box m) Source # 
Instance details

Defined in Data.Binder

Methods

pure :: a -> Box m a #

(<*>) :: Box m (a -> b) -> Box m a -> Box m b #

liftA2 :: (a -> b -> c) -> Box m a -> Box m b -> Box m c #

(*>) :: Box m a -> Box m b -> Box m b #

(<*) :: Box m a -> Box m b -> Box m a #

Functor (Box m) Source # 
Instance details

Defined in Data.Binder

Methods

fmap :: (a -> b) -> Box m a -> Box m b #

(<$) :: a -> Box m b -> Box m a #

class MkFree m a where Source #

Typeclass for free variable constructor.

Methods

mkFree :: Var m a -> a Source #

Variable

var'Key :: forall m a. Lens' (Var m a) (Numbering m) Source #

var'Box :: Lens' (Var m a) (Box m a) Source #

nameOf :: Var m a -> Text Source #

The name of variable.

boxVar :: Var m a -> Box m a Source #

Smart constructor for Box.

newVar :: forall m a. (MkFree m a, MonadNumbering m) => Text -> m (Var m a) Source #

Create a new variable with given name.

isClosed :: Box m a -> Bool Source #

Box is closed if it exposes no free variables.

occur :: MonadNumbering m => Var m a -> Box m b -> Bool Source #

Check if the variable occurs in the box.

Box

unbox :: forall m a. Box m a -> a Source #

Pick out and complete the construction of a.

box :: MonadNumbering m => a -> Box m a Source #

apBox :: MonadNumbering m => Box m (a -> b) -> Box m a -> Box m b Source #

boxApply :: (a -> b) -> Box m a -> Box m b Source #

boxApply2 :: MonadNumbering m => (a -> b -> c) -> Box m a -> Box m b -> Box m c 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 #

boxPair :: MonadNumbering m => Box m a -> Box m b -> Box m (a, b) Source #

boxTriple :: MonadNumbering m => Box m a -> Box m b -> Box m c -> Box m (a, b, c) Source #

boxT :: (MonadNumbering m, Traversable t) => t (Box m a) -> Box m (t a) Source #

Variable binding

data Binder a b Source #

Variable binding. Essentially, Binder a b means a -> b.

binder'Name :: forall a b. Lens' (Binder a b) Text Source #

binder'Body :: forall a b a b. Lens (Binder a b) (Binder a b) (a -> b) (a -> b) Source #

subst :: Binder a b -> a -> b Source #

Variable substitution.

buildBinder :: Var m a -> (a -> b) -> Binder a b Source #

Smart constructor for Binder.

bind :: (MkFree m a, MonadNumbering m) => Var m a -> Box m b -> Box m (Binder a b) Source #

binding

unbind :: (MkFree m a, MonadNumbering m) => Binder a b -> m (Var m a, b) Source #

unbinding

eqBinder :: (MkFree m a, MonadNumbering m) => (b -> b -> m Bool) -> Binder a b -> Binder a b -> m Bool Source #

Check if two bindings are equal.

boxBinder :: (MkFree m a, MonadNumbering m) => (b -> m (Box m b)) -> Binder a b -> m (Box m (Binder a b)) Source #