monad-ideals-0.1.0.0: Ideal Monads and coproduct of them
Copyright(C) 2008 Edward Kmett (C) 2024 Koji Miyazato
LicenseBSD-style (see the file LICENSE)
MaintainerKoji Miyazato <viercc@gmail.com>
Stabilityexperimental
Safe HaskellSafe-Inferred
LanguageHaskell2010

Control.Monad.Coproduct

Description

 
Synopsis

Ideal Monad Coproduct

newtype (m0 :+ n0) a Source #

Coproduct of impure parts of two Monads.

As the coproduct of Isolated

Given Isolated m0 and Isolated n0, the functor m0 :+ n0 is Isolated too. In other words, given two Monads 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.

  • hoistUnite inject1 :: Unite m0 ~> Unite (m0 :+ n0) is a monad morphism
  • hoistUnite inject2 :: Unite n0 ~> Unite (m0 :+ n0) is a monad morphism
  • eitherMonad mt nt :: (m0 :+ n0) ~> t is an impure monad morphism, given (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 MonadIdeal m0 and MonadIdeal n0, the functor m0 :+ n0 is MonadIdeal too. It is the coproduct of m0 and n0 as a MonadIdeal.

  • inject1 :: m0 ~> (m0 :+ n0) is a MonadIdeal morphism
  • inject2 :: n0 ~> (m0 :+ n0) is a MonadIdeal morphism
  • (mt |||| nt) :: (m0 :+ n0) ~> t0 is a MonadIdeal morphism, given mt, nt are MonadIdeal 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)

Constructors

Coproduct 

Fields

Instances

Instances details
(Functor m0, Functor n0) => Functor (m0 :+ n0) Source # 
Instance details

Defined in Control.Monad.Coproduct

Methods

fmap :: (a -> b) -> (m0 :+ n0) a -> (m0 :+ n0) b #

(<$) :: a -> (m0 :+ n0) b -> (m0 :+ n0) a #

(MonadIdeal m0, MonadIdeal n0) => MonadIdeal (m0 :+ n0) Source # 
Instance details

Defined in Control.Monad.Coproduct

Methods

idealBind :: (m0 :+ n0) a -> (a -> Ideal (m0 :+ n0) b) -> (m0 :+ n0) b Source #

(Isolated m0, Isolated n0) => Isolated (m0 :+ n0) Source # 
Instance details

Defined in Control.Monad.Coproduct

Methods

impureBind :: (m0 :+ n0) a -> (a -> Unite (m0 :+ n0) b) -> Unite (m0 :+ n0) b Source #

(MonadIdeal m0, MonadIdeal n0) => Apply (m0 :+ n0) Source # 
Instance details

Defined in Control.Monad.Coproduct

Methods

(<.>) :: (m0 :+ n0) (a -> b) -> (m0 :+ n0) a -> (m0 :+ n0) b #

(.>) :: (m0 :+ n0) a -> (m0 :+ n0) b -> (m0 :+ n0) b #

(<.) :: (m0 :+ n0) a -> (m0 :+ n0) b -> (m0 :+ n0) a #

liftF2 :: (a -> b -> c) -> (m0 :+ n0) a -> (m0 :+ n0) b -> (m0 :+ n0) c #

(MonadIdeal m0, MonadIdeal n0) => Bind (m0 :+ n0) Source # 
Instance details

Defined in Control.Monad.Coproduct

Methods

(>>-) :: (m0 :+ n0) a -> (a -> (m0 :+ n0) b) -> (m0 :+ n0) b #

join :: (m0 :+ n0) ((m0 :+ n0) a) -> (m0 :+ n0) a #

(Show (m0 (Either a (Mutual Either n0 m0 a))), Show (n0 (Either a (Mutual Either m0 n0 a)))) => Show ((m0 :+ n0) a) Source # 
Instance details

Defined in Control.Monad.Coproduct

Methods

showsPrec :: Int -> (m0 :+ n0) a -> ShowS #

show :: (m0 :+ n0) a -> String #

showList :: [(m0 :+ n0) a] -> ShowS #

(Eq (m0 (Either a (Mutual Either n0 m0 a))), Eq (n0 (Either a (Mutual Either m0 n0 a)))) => Eq ((m0 :+ n0) a) Source # 
Instance details

Defined in Control.Monad.Coproduct

Methods

(==) :: (m0 :+ n0) a -> (m0 :+ n0) a -> Bool #

(/=) :: (m0 :+ n0) a -> (m0 :+ n0) a -> Bool #

inject1 :: Functor m0 => m0 a -> (m0 :+ n0) a Source #

inject2 :: Functor n0 => n0 a -> (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 #

Constructors

Mutual 

Fields

Instances

Instances details
(Bifunctor p, Functor m, Functor n) => Functor (Mutual p m n) Source # 
Instance details

Defined in Control.Functor.Internal.Mutual

Methods

fmap :: (a -> b) -> Mutual p m n a -> Mutual p m n b #

(<$) :: a -> Mutual p m n b -> Mutual p m n a #

(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 # 
Instance details

Defined in Control.Functor.Internal.Mutual

Methods

showsPrec :: Int -> Mutual p n m a -> ShowS #

show :: Mutual p n m a -> String #

showList :: [Mutual p n m a] -> ShowS #

(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 # 
Instance details

Defined in Control.Functor.Internal.Mutual

Methods

(==) :: Mutual p n m a -> Mutual p n m a -> Bool #

(/=) :: Mutual p n m a -> Mutual p n m a -> Bool #