Copyright | (C) 2008 Edward Kmett (C) 2024 Koji Miyazato |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Koji Miyazato <viercc@gmail.com> |
Stability | experimental |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Control.Monad.Coproduct
Description
Synopsis
- newtype (m0 :+ n0) a = Coproduct {}
- inject1 :: Functor m0 => m0 a -> (m0 :+ n0) a
- inject2 :: Functor n0 => n0 a -> (m0 :+ n0) a
- (||||) :: MonadIdeal t => (forall a. m0 a -> t a) -> (forall a. n0 a -> t a) -> (m0 :+ n0) b -> t b
- eitherMonad :: (Isolated m0, Isolated n0, Monad t) => (forall a. m0 a -> t a) -> (forall a. n0 a -> t a) -> (m0 :+ n0) b -> t b
- newtype Mutual p m n a = Mutual {}
Ideal Monad Coproduct
Coproduct of impure parts of two Monad
s.
As the coproduct of Isolated
Given
and Isolated
m0Isolated n0
, the functor m0 :+ n0
is Isolated
too. In other words,
given two Monad
s Unite m0
and Unite n0
, this type constructs a new Monad (Unite (m0 :+ n0))
.
Furthermore, as the name suggests,
Unite (m0 :+ n0)
is the coproduct of Unite m0
and Unite n0
as a Monad
.
is a monad morphismhoistUnite
inject1
:: Unite m0 ~> Unite (m0 :+ n0)
is a monad morphismhoistUnite
inject2
:: Unite n0 ~> Unite (m0 :+ n0)
is an impure monad morphism, giveneitherMonad
mt nt :: (m0 :+ n0) ~> t(mt :: m0 ~> t)
and(nt :: n0 ~> t)
are impure monad morphisms.- Any impure monad morphisms
(m0 :+ n0) ~> t
can be uniquely rewritten as(eitherMonad mt nt)
.
Here, a natural transformation nat :: f ~> g
is an impure monad morphism means
f
is an Isolated
, g
is a Monad
, and nat
becomes a monad morphism when combined with pure
as below.
either pure nat . runUnite :: Unite f ~> g
As the coproduct of MonadIdeal
Given
and MonadIdeal
m0MonadIdeal n0
, the functor m0 :+ n0
is MonadIdeal
too.
It is the coproduct of m0
and n0
as a MonadIdeal
.
inject1 :: m0 ~> (m0 :+ n0)
is aMonadIdeal
morphisminject2 :: n0 ~> (m0 :+ n0)
is aMonadIdeal
morphism(mt |||| nt) :: (m0 :+ n0) ~> t0
is aMonadIdeal
morphism, givenmt, nt
areMonadIdeal
morphisms.- Any
MonadIdeal
morphism(m0 :+ n0) ~> t0
can be uniquely rewritten as(mt |||| nt)
.
Here, a MonadIdeal
morphism is a natural transformation nat
between MonadIdeal
such that
preserves idealBind
.
nat (idealBind ma k) = idealBind (nat ma) (hoistIdeal
nat . k)
Instances
(Foldable m0, Foldable n0) => Foldable (m0 :+ n0) Source # | |
Defined in Control.Monad.Coproduct Methods fold :: Monoid m => (m0 :+ n0) m -> m # foldMap :: Monoid m => (a -> m) -> (m0 :+ n0) a -> m # foldMap' :: Monoid m => (a -> m) -> (m0 :+ n0) a -> m # foldr :: (a -> b -> b) -> b -> (m0 :+ n0) a -> b # foldr' :: (a -> b -> b) -> b -> (m0 :+ n0) a -> b # foldl :: (b -> a -> b) -> b -> (m0 :+ n0) a -> b # foldl' :: (b -> a -> b) -> b -> (m0 :+ n0) a -> b # foldr1 :: (a -> a -> a) -> (m0 :+ n0) a -> a # foldl1 :: (a -> a -> a) -> (m0 :+ n0) a -> a # toList :: (m0 :+ n0) a -> [a] # null :: (m0 :+ n0) a -> Bool # length :: (m0 :+ n0) a -> Int # elem :: Eq a => a -> (m0 :+ n0) a -> Bool # maximum :: Ord a => (m0 :+ n0) a -> a # minimum :: Ord a => (m0 :+ n0) a -> a # | |
(Traversable m0, Traversable n0) => Traversable (m0 :+ n0) Source # | |
Defined in Control.Monad.Coproduct | |
(Functor m0, Functor n0) => Functor (m0 :+ n0) Source # | |
(MonadIdeal m0, MonadIdeal n0) => MonadIdeal (m0 :+ n0) Source # | |
(Isolated m0, Isolated n0) => Isolated (m0 :+ n0) Source # | |
Defined in Control.Monad.Coproduct | |
(MonadIdeal m0, MonadIdeal n0) => Apply (m0 :+ n0) Source # | |
(MonadIdeal m0, MonadIdeal n0) => Bind (m0 :+ n0) Source # | |
(Show (m0 (Either a (Mutual Either n0 m0 a))), Show (n0 (Either a (Mutual Either m0 n0 a)))) => Show ((m0 :+ n0) a) Source # | |
(Eq (m0 (Either a (Mutual Either n0 m0 a))), Eq (n0 (Either a (Mutual Either m0 n0 a)))) => Eq ((m0 :+ n0) a) Source # | |
(||||) :: MonadIdeal t => (forall a. m0 a -> t a) -> (forall a. n0 a -> t a) -> (m0 :+ n0) b -> t b Source #
eitherMonad :: (Isolated m0, Isolated n0, Monad t) => (forall a. m0 a -> t a) -> (forall a. n0 a -> t a) -> (m0 :+ n0) b -> t b Source #
Mutual recursion for ideal monad coproducts
newtype Mutual p m n a Source #
Instances
(Bifoldable p, Foldable m, Foldable n) => Foldable (Mutual p m n) Source # | |
Defined in Control.Functor.Internal.Mutual Methods fold :: Monoid m0 => Mutual p m n m0 -> m0 # foldMap :: Monoid m0 => (a -> m0) -> Mutual p m n a -> m0 # foldMap' :: Monoid m0 => (a -> m0) -> Mutual p m n a -> m0 # foldr :: (a -> b -> b) -> b -> Mutual p m n a -> b # foldr' :: (a -> b -> b) -> b -> Mutual p m n a -> b # foldl :: (b -> a -> b) -> b -> Mutual p m n a -> b # foldl' :: (b -> a -> b) -> b -> Mutual p m n a -> b # foldr1 :: (a -> a -> a) -> Mutual p m n a -> a # foldl1 :: (a -> a -> a) -> Mutual p m n a -> a # toList :: Mutual p m n a -> [a] # null :: Mutual p m n a -> Bool # length :: Mutual p m n a -> Int # elem :: Eq a => a -> Mutual p m n a -> Bool # maximum :: Ord a => Mutual p m n a -> a # minimum :: Ord a => Mutual p m n a -> a # | |
(Bitraversable p, Traversable m, Traversable n) => Traversable (Mutual p m n) Source # | |
Defined in Control.Functor.Internal.Mutual Methods traverse :: Applicative f => (a -> f b) -> Mutual p m n a -> f (Mutual p m n b) # sequenceA :: Applicative f => Mutual p m n (f a) -> f (Mutual p m n a) # mapM :: Monad m0 => (a -> m0 b) -> Mutual p m n a -> m0 (Mutual p m n b) # sequence :: Monad m0 => Mutual p m n (m0 a) -> m0 (Mutual p m n a) # | |
(Bifunctor p, Functor m, Functor n) => Functor (Mutual p m n) Source # | |
(Show (m (p a (Mutual p n m a))), Show (n (p a (Mutual p m n a)))) => Show (Mutual p n m a) Source # | |
(Eq (m (p a (Mutual p n m a))), Eq (n (p a (Mutual p m n a)))) => Eq (Mutual p n m a) Source # | |