Copyright | (C) 2008 Edward Kmett (C) 2024 Koji Miyazato |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Koji Miyazato <viercc@gmail.com> |
Stability | experimental |
Portability | portable |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Synopsis
- class (Bind m0, Isolated m0) => MonadIdeal m0 where
- idealize :: MonadIdeal m0 => m0 (Ideal m0 a) -> m0 a
- type Ideal = Unite
- ideal :: Either a (m0 a) -> Ideal m0 a
- runIdeal :: Ideal m0 a -> Either a (m0 a)
- hoistIdeal :: (forall a. m0 a -> n a) -> Ideal m0 b -> Ideal n b
- destroyIdeal :: (m0 a -> a) -> Ideal m0 a -> a
- bindDefault :: MonadIdeal m0 => m0 a -> (a -> m0 b) -> m0 b
- impureBindDefault :: MonadIdeal m0 => m0 a -> (a -> Unite m0 b) -> Unite m0 b
Ideal Monads
class (Bind m0, Isolated m0) => MonadIdeal m0 where Source #
m0
is the "ideal part" of an ideal monad.
Laws
Methods inherited from superclasses must be equivalent to the canocical ones.
Instances
MonadIdeal TwoOrMore Source # | Ideal TwoOrMore ~ NonEmpty |
Monad m => MonadIdeal (WrappedMonad m) Source # | Any |
Defined in Control.Monad.Ideal idealBind :: WrappedMonad m a -> (a -> Ideal (WrappedMonad m) b) -> WrappedMonad m b Source # | |
MonadIdeal (KeepLeft c) Source # | Ideal (KeepLeft c) a ~ Either c a |
Semigroup s => MonadIdeal ((,) s) Source # | Ideal ((,) s) ~ (,) (Maybe s) |
(MonadIdeal m0, MonadIdeal n0) => MonadIdeal (m0 :+ n0) Source # | |
idealize :: MonadIdeal m0 => m0 (Ideal m0 a) -> m0 a Source #
runIdeal :: Ideal m0 a -> Either a (m0 a) Source #
Deconstructor of Ideal
, for backward compatibility
hoistIdeal :: (forall a. m0 a -> n a) -> Ideal m0 b -> Ideal n b Source #
Alias of hoistUnite
for naming consistently
destroyIdeal :: (m0 a -> a) -> Ideal m0 a -> a Source #
bindDefault :: MonadIdeal m0 => m0 a -> (a -> m0 b) -> m0 b Source #
MonadIdeal
implies Bind
impureBindDefault :: MonadIdeal m0 => m0 a -> (a -> Unite m0 b) -> Unite m0 b Source #
MonadIdeal
implies Isolated
Relation between MonadIdeal
, Bind
, and Isolated
MonadIdeal
is a requirement stronger than both of Bind
and Isolated
.
In fact, these subset relations hold.
- Every
MonadIdeal
isBind
- Every
MonadIdeal
isIsolated
These are strict subset relation and neither of three classes can be dropped.
NotOne
is bothBind
andIsolated
, but notMonadIdeal
.NullBind c
isBind
but can't beIsolated
, becauseUnite (NullBind c)
can't be aMonad
in a compatible way.newtype NullBind c a = NullBind (Maybe c) instance Bind (NullBind c a) where _ >>- _ = NullBind Nothing
Toggle
shown below isIsolated
, but can't be aBind
in a compatible way.newtype Toggle a = Toggle a deriving Functor instance Isolated Toggle where impureBind (Toggle a) k = case k a of Unite (Left b) -> Unite (Right (Toggle b)) Unite (Right (Toggle b)) -> Unite (Left b)