Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- newtype Scope n f a = Scope {}
- pattern ScopeBound :: Int -> Scope n f a
- pattern ScopeFree :: a -> Scope n f a
- pattern ScopeBinder :: Int -> n -> Scope n f a -> Scope n f a
- pattern ScopeEmbed :: f (Scope n f a) -> Scope n f a
- scopeWFromInnerBinder :: ScopeWC t u n f g => BinderScope n (g a) -> u (g a)
- scopeBind :: Functor f => (a -> Scope n f b) -> Scope n f a -> Scope n f b
- scopeBindOpt :: Functor f => (a -> Maybe (Scope n f a)) -> Scope n f a -> Scope n f a
- scopeLift :: Traversable f => f a -> Scope n f a
- scopeInnerBinder :: (Functor f, Eq a) => n -> Seq a -> Scope n f a -> BinderScope n (Scope n f a)
- scopeInnerBinder1 :: (Functor f, Eq a) => n -> a -> Scope n f a -> BinderScope n (Scope n f a)
- scopeAbstract :: (Functor f, Eq a) => n -> Seq a -> Scope n f a -> Scope n f a
- scopeAbstract1 :: (Functor f, Eq a) => n -> a -> Scope n f a -> Scope n f a
- scopeUnAbstract :: Functor f => Seq a -> Scope n f a -> Scope n f a
- scopeUnAbstract1 :: Functor f => a -> Scope n f a -> Scope n f a
- scopeInstantiate :: Functor f => Seq (Scope n f a) -> Scope n f a -> Scope n f a
- scopeInstantiate1 :: Functor f => Scope n f a -> Scope n f a -> Scope n f a
- scopeApply :: Functor f => Seq (Scope n f a) -> Scope n f a -> Either SubError (Scope n f a)
- scopeApply1 :: Functor f => Scope n f a -> Scope n f a -> Either SubError (Scope n f a)
Documentation
A simple wrapper for your expression functor that knows how to name-bind.
Create free variables is pure
, bind them with >>=
, and list free variables with folds.
See LocScope
for a version with additional annotations between layers.
Instances
Functor f => Monad (Scope n f) Source # | |
Functor f => Functor (Scope n f) Source # | |
Functor f => Applicative (Scope n f) Source # | |
Foldable f => Foldable (Scope n f) Source # | |
Defined in Blanks.Scope fold :: Monoid m => Scope n f m -> m # foldMap :: Monoid m => (a -> m) -> Scope n f a -> m # foldMap' :: Monoid m => (a -> m) -> Scope n f a -> m # foldr :: (a -> b -> b) -> b -> Scope n f a -> b # foldr' :: (a -> b -> b) -> b -> Scope n f a -> b # foldl :: (b -> a -> b) -> b -> Scope n f a -> b # foldl' :: (b -> a -> b) -> b -> Scope n f a -> b # foldr1 :: (a -> a -> a) -> Scope n f a -> a # foldl1 :: (a -> a -> a) -> Scope n f a -> a # toList :: Scope n f a -> [a] # length :: Scope n f a -> Int # elem :: Eq a => a -> Scope n f a -> Bool # maximum :: Ord a => Scope n f a -> a # minimum :: Ord a => Scope n f a -> a # | |
Traversable f => Traversable (Scope n f) Source # | |
(Eq (f (Scope n f a)), Eq n, Eq a) => Eq (Scope n f a) Source # | |
(Show (f (Scope n f a)), Show n, Show a) => Show (Scope n f a) Source # | |
(NFData n, NFData a, NFData (f (Scope n f a))) => NFData (Scope n f a) Source # | |
Defined in Blanks.Scope | |
NatNewtype (ScopeW Identity n f (Scope n f)) (Scope n f) Source # | |
Defined in Blanks.Scope |
pattern ScopeBound :: Int -> Scope n f a Source #
pattern ScopeEmbed :: f (Scope n f a) -> Scope n f a Source #
scopeWFromInnerBinder :: ScopeWC t u n f g => BinderScope n (g a) -> u (g a) Source #
scopeBind :: Functor f => (a -> Scope n f b) -> Scope n f a -> Scope n f b Source #
Substitution as a kind of monadic bind.
scopeBindOpt :: Functor f => (a -> Maybe (Scope n f a)) -> Scope n f a -> Scope n f a Source #
Optional substitution as another kind of monadic bind.
scopeLift :: Traversable f => f a -> Scope n f a Source #
Lift an expression functor into the scope functor.
scopeInnerBinder :: (Functor f, Eq a) => n -> Seq a -> Scope n f a -> BinderScope n (Scope n f a) Source #
scopeInnerBinder1 :: (Functor f, Eq a) => n -> a -> Scope n f a -> BinderScope n (Scope n f a) Source #
:: (Functor f, Eq a) | |
=> n | Annotation specific to your expression functor. Might contain original variable names and types, or might mark this as a "let" vs a "lambda" |
-> Seq a | Free variables to bind, like the names of function parameters |
-> Scope n f a | The expression to bind in, like the body of a function |
-> Scope n f a |
Binds free variables in an expression and returns a binder.
scopeAbstract1 :: (Functor f, Eq a) => n -> a -> Scope n f a -> Scope n f a Source #
scopeAbstract
for a single argument.
:: Functor f | |
=> Seq a | The names of the variables you're freeing |
-> Scope n f a | The expression to substitute in (typically a binder) |
-> Scope n f a |
Un-bind free variables in an expression. Basically the inverse of
scopeAbstract
. Take care to match the arity of the binder! (scopeApply
is safer.)
:: Functor f | |
=> Seq (Scope n f a) | Expressions to substitute in place of bound vars |
-> Scope n f a | The expression to substitute in (typically a binder) |
-> Scope n f a |
Instantiate the bound variables in an expression with other expressions.
Take care to match the arity of the binder! (scopeApply
is safer.)
scopeInstantiate1 :: Functor f => Scope n f a -> Scope n f a -> Scope n f a Source #
scopeInstantiate
for a single argument.
:: Functor f | |
=> Seq (Scope n f a) | Expressions to substitute in place of bound vars |
-> Scope n f a | The binder expression to substitute in |
-> Either SubError (Scope n f a) |
Instantiates the bound variables in an expression with other expressions.
Throws errors on mismatched arity, non binder expression, unbound vars, etc.
A version of scopeInstantiate
that fails loudly instead of silently!
scopeApply1 :: Functor f => Scope n f a -> Scope n f a -> Either SubError (Scope n f a) Source #
scopeApply
for a single argument.