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 |
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
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 & andThen return = f
return & andThen f = f
f & andThenIx g & andThenIx h = f & andThenIx (g & andThenIx h)
Instances
IxMonadTrans StateIx Source # | |
Defined in Control.Monad.Trans.Indexed.State 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 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 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 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 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.
Indexed | |
|