unbound-0.5.1.1: Generic support for programming with names and binders

LicenseBSD-like (see LICENSE)
MaintainerBrent Yorgey <byorgey@cis.upenn.edu>
Stabilityexperimental
Portabilityunportable (GHC 7 only)
Safe HaskellNone
LanguageHaskell2010

Unbound.LocallyNameless.Fresh

Contents

Description

The Fresh and LFresh classes, which govern monads with fresh name generation capabilities, and the FreshM(T) and LFreshM(T) monad (transformers) which provide useful default implementations.

Synopsis

The Fresh class

class Monad m => Fresh m where Source #

The Fresh type class governs monads which can generate new globally unique Names based on a given Name.

Minimal complete definition

fresh

Methods

fresh :: Rep a => Name a -> m (Name a) Source #

Generate a new globally unique name based on the given one.

Instances
Fresh m => Fresh (ListT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> ListT m (Name a) Source #

Fresh m => Fresh (MaybeT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> MaybeT m (Name a) Source #

Monad m => Fresh (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> FreshMT m (Name a) Source #

Fresh m => Fresh (IdentityT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> IdentityT m (Name a) Source #

Fresh m => Fresh (ExceptT e m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> ExceptT e m (Name a) Source #

Fresh m => Fresh (StateT s m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> StateT s m (Name a) Source #

Fresh m => Fresh (StateT s m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> StateT s m (Name a) Source #

(Monoid w, Fresh m) => Fresh (WriterT w m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> WriterT w m (Name a) Source #

(Monoid w, Fresh m) => Fresh (WriterT w m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> WriterT w m (Name a) Source #

Fresh m => Fresh (ContT r m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> ContT r m (Name a) Source #

Fresh m => Fresh (ReaderT r m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> ReaderT r m (Name a) Source #

type FreshM = FreshMT Identity Source #

A convenient monad which is an instance of Fresh. It keeps track of a global index used for generating fresh names, which is incremented every time fresh is called.

runFreshM :: FreshM a -> a Source #

Run a FreshM computation (with the global index starting at zero).

contFreshM :: FreshM a -> Integer -> a Source #

Run a FreshM computation given a starting index.

newtype FreshMT m a Source #

The FreshM monad transformer. Keeps track of the lowest index still globally unused, and increments the index every time it is asked for a fresh name.

Constructors

FreshMT 

Fields

Instances
MonadTrans FreshMT Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lift :: Monad m => m a -> FreshMT m a #

MonadWriter w m => MonadWriter w (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

writer :: (a, w) -> FreshMT m a #

tell :: w -> FreshMT m () #

listen :: FreshMT m a -> FreshMT m (a, w) #

pass :: FreshMT m (a, w -> w) -> FreshMT m a #

MonadState s m => MonadState s (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

get :: FreshMT m s #

put :: s -> FreshMT m () #

state :: (s -> (a, s)) -> FreshMT m a #

MonadReader r m => MonadReader r (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

ask :: FreshMT m r #

local :: (r -> r) -> FreshMT m a -> FreshMT m a #

reader :: (r -> a) -> FreshMT m a #

MonadError e m => MonadError e (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

throwError :: e -> FreshMT m a #

catchError :: FreshMT m a -> (e -> FreshMT m a) -> FreshMT m a #

Monad m => Monad (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

(>>=) :: FreshMT m a -> (a -> FreshMT m b) -> FreshMT m b #

(>>) :: FreshMT m a -> FreshMT m b -> FreshMT m b #

return :: a -> FreshMT m a #

fail :: String -> FreshMT m a #

Functor m => Functor (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

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

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

MonadFix m => MonadFix (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

mfix :: (a -> FreshMT m a) -> FreshMT m a #

Monad m => Applicative (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

pure :: a -> FreshMT m a #

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

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

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

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

MonadIO m => MonadIO (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

liftIO :: IO a -> FreshMT m a #

MonadPlus m => Alternative (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

empty :: FreshMT m a #

(<|>) :: FreshMT m a -> FreshMT m a -> FreshMT m a #

some :: FreshMT m a -> FreshMT m [a] #

many :: FreshMT m a -> FreshMT m [a] #

MonadPlus m => MonadPlus (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

mzero :: FreshMT m a #

mplus :: FreshMT m a -> FreshMT m a -> FreshMT m a #

MonadCont m => MonadCont (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

callCC :: ((a -> FreshMT m b) -> FreshMT m a) -> FreshMT m a #

Monad m => Fresh (FreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

fresh :: Rep a => Name a -> FreshMT m (Name a) Source #

runFreshMT :: Monad m => FreshMT m a -> m a Source #

Run a FreshMT computation (with the global index starting at zero).

contFreshMT :: Monad m => FreshMT m a -> Integer -> m a Source #

Run a FreshMT computation given a starting index for fresh name generation.

The LFresh class

class Monad m => LFresh m where Source #

This is the class of monads that support freshness in an (implicit) local scope. Generated names are fresh for the current local scope, not necessarily globally fresh.

Minimal complete definition

lfresh, avoid, getAvoids

Methods

lfresh :: Rep a => Name a -> m (Name a) Source #

Pick a new name that is fresh for the current (implicit) scope.

avoid :: [AnyName] -> m a -> m a Source #

Avoid the given names when freshening in the subcomputation, that is, add the given names to the in-scope set.

getAvoids :: m (Set AnyName) Source #

Get the set of names currently being avoided.

Instances
LFresh m => LFresh (ListT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lfresh :: Rep a => Name a -> ListT m (Name a) Source #

avoid :: [AnyName] -> ListT m a -> ListT m a Source #

getAvoids :: ListT m (Set AnyName) Source #

LFresh m => LFresh (MaybeT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lfresh :: Rep a => Name a -> MaybeT m (Name a) Source #

avoid :: [AnyName] -> MaybeT m a -> MaybeT m a Source #

getAvoids :: MaybeT m (Set AnyName) Source #

Monad m => LFresh (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lfresh :: Rep a => Name a -> LFreshMT m (Name a) Source #

avoid :: [AnyName] -> LFreshMT m a -> LFreshMT m a Source #

getAvoids :: LFreshMT m (Set AnyName) Source #

LFresh m => LFresh (IdentityT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

LFresh m => LFresh (ExceptT e m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lfresh :: Rep a => Name a -> ExceptT e m (Name a) Source #

avoid :: [AnyName] -> ExceptT e m a -> ExceptT e m a Source #

getAvoids :: ExceptT e m (Set AnyName) Source #

LFresh m => LFresh (StateT s m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lfresh :: Rep a => Name a -> StateT s m (Name a) Source #

avoid :: [AnyName] -> StateT s m a -> StateT s m a Source #

getAvoids :: StateT s m (Set AnyName) Source #

LFresh m => LFresh (StateT s m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lfresh :: Rep a => Name a -> StateT s m (Name a) Source #

avoid :: [AnyName] -> StateT s m a -> StateT s m a Source #

getAvoids :: StateT s m (Set AnyName) Source #

(Monoid w, LFresh m) => LFresh (WriterT w m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lfresh :: Rep a => Name a -> WriterT w m (Name a) Source #

avoid :: [AnyName] -> WriterT w m a -> WriterT w m a Source #

getAvoids :: WriterT w m (Set AnyName) Source #

(Monoid w, LFresh m) => LFresh (WriterT w m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lfresh :: Rep a => Name a -> WriterT w m (Name a) Source #

avoid :: [AnyName] -> WriterT w m a -> WriterT w m a Source #

getAvoids :: WriterT w m (Set AnyName) Source #

LFresh m => LFresh (ContT r m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lfresh :: Rep a => Name a -> ContT r m (Name a) Source #

avoid :: [AnyName] -> ContT r m a -> ContT r m a Source #

getAvoids :: ContT r m (Set AnyName) Source #

LFresh m => LFresh (ReaderT r m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lfresh :: Rep a => Name a -> ReaderT r m (Name a) Source #

avoid :: [AnyName] -> ReaderT r m a -> ReaderT r m a Source #

getAvoids :: ReaderT r m (Set AnyName) Source #

type LFreshM = LFreshMT Identity Source #

A convenient monad which is an instance of LFresh. It keeps track of a set of names to avoid, and when asked for a fresh one will choose the first unused numerical name.

runLFreshM :: LFreshM a -> a Source #

Run a LFreshM computation in an empty context.

contLFreshM :: LFreshM a -> Set AnyName -> a Source #

Run a LFreshM computation given a set of names to avoid.

newtype LFreshMT m a Source #

The LFresh monad transformer. Keeps track of a set of names to avoid, and when asked for a fresh one will choose the first numeric prefix of the given name which is currently unused.

Constructors

LFreshMT 

Fields

Instances
MonadTrans LFreshMT Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lift :: Monad m => m a -> LFreshMT m a #

MonadWriter w m => MonadWriter w (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

writer :: (a, w) -> LFreshMT m a #

tell :: w -> LFreshMT m () #

listen :: LFreshMT m a -> LFreshMT m (a, w) #

pass :: LFreshMT m (a, w -> w) -> LFreshMT m a #

MonadState s m => MonadState s (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

get :: LFreshMT m s #

put :: s -> LFreshMT m () #

state :: (s -> (a, s)) -> LFreshMT m a #

MonadReader r m => MonadReader r (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

ask :: LFreshMT m r #

local :: (r -> r) -> LFreshMT m a -> LFreshMT m a #

reader :: (r -> a) -> LFreshMT m a #

MonadError e m => MonadError e (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

throwError :: e -> LFreshMT m a #

catchError :: LFreshMT m a -> (e -> LFreshMT m a) -> LFreshMT m a #

Monad m => Monad (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

(>>=) :: LFreshMT m a -> (a -> LFreshMT m b) -> LFreshMT m b #

(>>) :: LFreshMT m a -> LFreshMT m b -> LFreshMT m b #

return :: a -> LFreshMT m a #

fail :: String -> LFreshMT m a #

Functor m => Functor (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

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

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

MonadFix m => MonadFix (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

mfix :: (a -> LFreshMT m a) -> LFreshMT m a #

Applicative m => Applicative (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

pure :: a -> LFreshMT m a #

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

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

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

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

MonadIO m => MonadIO (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

liftIO :: IO a -> LFreshMT m a #

Alternative m => Alternative (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

empty :: LFreshMT m a #

(<|>) :: LFreshMT m a -> LFreshMT m a -> LFreshMT m a #

some :: LFreshMT m a -> LFreshMT m [a] #

many :: LFreshMT m a -> LFreshMT m [a] #

MonadPlus m => MonadPlus (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

mzero :: LFreshMT m a #

mplus :: LFreshMT m a -> LFreshMT m a -> LFreshMT m a #

MonadCont m => MonadCont (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

callCC :: ((a -> LFreshMT m b) -> LFreshMT m a) -> LFreshMT m a #

Monad m => LFresh (LFreshMT m) Source # 
Instance details

Defined in Unbound.LocallyNameless.Fresh

Methods

lfresh :: Rep a => Name a -> LFreshMT m (Name a) Source #

avoid :: [AnyName] -> LFreshMT m a -> LFreshMT m a Source #

getAvoids :: LFreshMT m (Set AnyName) Source #

runLFreshMT :: LFreshMT m a -> m a Source #

Run an LFreshMT computation in an empty context.

contLFreshMT :: LFreshMT m a -> Set AnyName -> m a Source #

Run an LFreshMT computation given a set of names to avoid.