Copyright | (C) 2024 Eitan Chatav |
---|---|
License | BSD 3-Clause License (see the file LICENSE) |
Maintainer | Eitan Chatav <eitan.chatav@gmail.com> |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Control.Monad.Trans.Indexed
Description
Indexed monad transformers.
Synopsis
- class (forall i j m. Monad m => Functor (t i j m), forall i j m. (i ~ j, Monad m) => Monad (t i j m), forall i j. i ~ j => MonadTrans (t i j)) => IxMonadTrans t where
- apIx :: Monad m => t i j m (x -> y) -> t j k m x -> t i k m y
- joinIx :: Monad m => t i j m (t j k m y) -> t i k m y
- bindIx :: Monad m => (x -> t j k m y) -> t i j m x -> t i k m y
- thenIx :: Monad m => t j k m y -> t i j m x -> t i k m y
- andThenIx :: Monad m => (y -> t j k m z) -> (x -> t i j m y) -> x -> t i k m z
- newtype Indexed t m r i j = Indexed {
- runIndexed :: t i j m r
- (&) :: a -> (a -> b) -> b
Documentation
class (forall i j m. Monad m => Functor (t i j m), forall i j m. (i ~ j, Monad m) => Monad (t i j m), forall i j. i ~ j => MonadTrans (t i j)) => IxMonadTrans t where Source #
An Atkey indexed monad
is a Functor
enriched category.
An indexed monad transformer transforms a Monad
into an indexed monad.
It is a monad and monad transformer when its source and target index
are the same, enabling use of standard do
notation in that case.
In the general case, qualified Indexed.do
notation can be used,
even if the source and target index are different.
>>>
:set -XQualifiedDo
>>>
import qualified Control.Monad.Trans.Indexed.Do as Indexed
Methods
apIx :: Monad m => t i j m (x -> y) -> t j k m x -> t i k m y Source #
indexed analog of <*>
(<*>) = apIx
joinIx :: Monad m => t i j m (t j k m y) -> t i k m y Source #
bindIx :: Monad m => (x -> t j k m y) -> t i j m x -> t i k m y Source #
indexed analog of =<<
(=<<) = bindIx
bindIx f x = joinIx (f <$> x)
x & bindIx return = x
x & bindIx f & bindIx g = x & bindIx (f & andThenIx g)
thenIx :: Monad m => t j k m y -> t i j m x -> t i k m y Source #
andThenIx :: Monad m => (y -> t j k m z) -> (x -> t i j m y) -> x -> t i k m z Source #
indexed analog of <=<
(<=<) = andThenIx
andThenIx g f x = bindIx g (f x)
f & andThenIx return = f
return & andThenIx f = f
f & andThenIx g & andThenIx h = f & andThenIx (g & andThenIx h)
Instances
IxMonadTrans StateIx Source # | |
Defined in Control.Monad.Trans.Indexed.State Methods apIx :: forall (m :: Type -> Type) (i :: k) (j :: k) x y (k1 :: k). Monad m => StateIx i j m (x -> y) -> StateIx j k1 m x -> StateIx i k1 m y Source # joinIx :: forall (m :: Type -> Type) (i :: k) (j :: k) (k1 :: k) y. Monad m => StateIx i j m (StateIx j k1 m y) -> StateIx i k1 m y Source # bindIx :: forall (m :: Type -> Type) x (j :: k) (k1 :: k) y (i :: k). Monad m => (x -> StateIx j k1 m y) -> StateIx i j m x -> StateIx i k1 m y Source # thenIx :: forall (m :: Type -> Type) (j :: k) (k1 :: k) y (i :: k) x. Monad m => StateIx j k1 m y -> StateIx i j m x -> StateIx i k1 m y Source # andThenIx :: forall (m :: Type -> Type) y (j :: k) (k1 :: k) z x (i :: k). Monad m => (y -> StateIx j k1 m z) -> (x -> StateIx i j m y) -> x -> StateIx i k1 m z Source # | |
IxMonadTrans (ContIx :: Type -> Type -> (Type -> Type) -> Type -> Type) Source # | |
Defined in Control.Monad.Trans.Indexed.Cont Methods apIx :: forall (m :: Type -> Type) (i :: k) (j :: k) x y (k1 :: k). Monad m => ContIx i j m (x -> y) -> ContIx j k1 m x -> ContIx i k1 m y Source # joinIx :: forall (m :: Type -> Type) (i :: k) (j :: k) (k1 :: k) y. Monad m => ContIx i j m (ContIx j k1 m y) -> ContIx i k1 m y Source # bindIx :: forall (m :: Type -> Type) x (j :: k) (k1 :: k) y (i :: k). Monad m => (x -> ContIx j k1 m y) -> ContIx i j m x -> ContIx i k1 m y Source # thenIx :: forall (m :: Type -> Type) (j :: k) (k1 :: k) y (i :: k) x. Monad m => ContIx j k1 m y -> ContIx i j m x -> ContIx i k1 m y Source # andThenIx :: forall (m :: Type -> Type) y (j :: k) (k1 :: k) z x (i :: k). Monad m => (y -> ContIx j k1 m z) -> (x -> ContIx i j m y) -> x -> ContIx i k1 m z Source # | |
IxFunctor f => IxMonadTrans (FreeIx f :: k -> k -> (Type -> Type) -> Type -> Type) Source # | |
Defined in Control.Monad.Trans.Indexed.Free.Fold Methods apIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) x y (k1 :: k0). Monad m => FreeIx f i j m (x -> y) -> FreeIx f j k1 m x -> FreeIx f i k1 m y Source # joinIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) (k1 :: k0) y. Monad m => FreeIx f i j m (FreeIx f j k1 m y) -> FreeIx f i k1 m y Source # bindIx :: forall (m :: Type -> Type) x (j :: k0) (k1 :: k0) y (i :: k0). Monad m => (x -> FreeIx f j k1 m y) -> FreeIx f i j m x -> FreeIx f i k1 m y Source # thenIx :: forall (m :: Type -> Type) (j :: k0) (k1 :: k0) y (i :: k0) x. Monad m => FreeIx f j k1 m y -> FreeIx f i j m x -> FreeIx f i k1 m y Source # andThenIx :: forall (m :: Type -> Type) y (j :: k0) (k1 :: k0) z x (i :: k0). Monad m => (y -> FreeIx f j k1 m z) -> (x -> FreeIx f i j m y) -> x -> FreeIx f i k1 m z Source # | |
IxFunctor f => IxMonadTrans (FreeIx f :: k -> k -> (Type -> Type) -> Type -> Type) Source # | |
Defined in Control.Monad.Trans.Indexed.Free.Wrap Methods apIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) x y (k1 :: k0). Monad m => FreeIx f i j m (x -> y) -> FreeIx f j k1 m x -> FreeIx f i k1 m y Source # joinIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) (k1 :: k0) y. Monad m => FreeIx f i j m (FreeIx f j k1 m y) -> FreeIx f i k1 m y Source # bindIx :: forall (m :: Type -> Type) x (j :: k0) (k1 :: k0) y (i :: k0). Monad m => (x -> FreeIx f j k1 m y) -> FreeIx f i j m x -> FreeIx f i k1 m y Source # thenIx :: forall (m :: Type -> Type) (j :: k0) (k1 :: k0) y (i :: k0) x. Monad m => FreeIx f j k1 m y -> FreeIx f i j m x -> FreeIx f i k1 m y Source # andThenIx :: forall (m :: Type -> Type) y (j :: k0) (k1 :: k0) z x (i :: k0). Monad m => (y -> FreeIx f j k1 m z) -> (x -> FreeIx f i j m y) -> x -> FreeIx f i k1 m z Source # | |
Category w => IxMonadTrans (WriterIx w :: k -> k -> (Type -> Type) -> Type -> Type) Source # | |
Defined in Control.Monad.Trans.Indexed.Writer Methods apIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) x y (k1 :: k0). Monad m => WriterIx w i j m (x -> y) -> WriterIx w j k1 m x -> WriterIx w i k1 m y Source # joinIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) (k1 :: k0) y. Monad m => WriterIx w i j m (WriterIx w j k1 m y) -> WriterIx w i k1 m y Source # bindIx :: forall (m :: Type -> Type) x (j :: k0) (k1 :: k0) y (i :: k0). Monad m => (x -> WriterIx w j k1 m y) -> WriterIx w i j m x -> WriterIx w i k1 m y Source # thenIx :: forall (m :: Type -> Type) (j :: k0) (k1 :: k0) y (i :: k0) x. Monad m => WriterIx w j k1 m y -> WriterIx w i j m x -> WriterIx w i k1 m y Source # andThenIx :: forall (m :: Type -> Type) y (j :: k0) (k1 :: k0) z x (i :: k0). Monad m => (y -> WriterIx w j k1 m z) -> (x -> WriterIx w i j m y) -> x -> WriterIx w i k1 m z Source # |
newtype Indexed t m r i j Source #
Indexed
reshuffles the type parameters of an IxMonadTrans
,
exposing its Category
instance.
Constructors
Indexed | |
Fields
|