unification-fd-0.10.0.1: Simple generic unification algorithms.

LicenseBSD
Maintainerwren@community.haskell.org
Stabilityprovisional
Portabilitysemi-portable (CPP, Rank2Types, MPTCs)
Safe HaskellSafe
LanguageHaskell98

Control.Monad.MaybeK

Contents

Description

A continuation-passing variant of Maybe for short-circuiting at failure. This is based largely on code from the Haskell Wiki (http://www.haskell.org/haskellwiki/Performance/Monads) which was released under a simple permissive license (http://www.haskell.org/haskellwiki/HaskellWiki:Copyrights). However, various changes and extensions have been made, which are subject to the BSD license of this package.

Synopsis

The partiality monad

data MaybeK a #

A continuation-passing encoding of Maybe; also known as Codensity Maybe, if you're familiar with that terminology. N.B., this is not the 2-continuation implementation based on the Church encoding of Maybe. The latter tends to have worse performance than non-continuation based implementations.

This is generally more efficient than using Maybe for two reasons. First is that it right associates all binds, ensuring that bad associativity doesn't artificially introduce midpoints in short-circuiting to the nearest handler. Second is that it removes the need for intermediate case expressions.

N.B., the Alternative and MonadPlus instances are left-biased in a. Thus, they are not commutative.

Instances

Monad MaybeK # 

Methods

(>>=) :: MaybeK a -> (a -> MaybeK b) -> MaybeK b #

(>>) :: MaybeK a -> MaybeK b -> MaybeK b #

return :: a -> MaybeK a #

fail :: String -> MaybeK a #

Functor MaybeK # 

Methods

fmap :: (a -> b) -> MaybeK a -> MaybeK b #

(<$) :: a -> MaybeK b -> MaybeK a #

Applicative MaybeK # 

Methods

pure :: a -> MaybeK a #

(<*>) :: MaybeK (a -> b) -> MaybeK a -> MaybeK b #

(*>) :: MaybeK a -> MaybeK b -> MaybeK b #

(<*) :: MaybeK a -> MaybeK b -> MaybeK a #

Alternative MaybeK # 

Methods

empty :: MaybeK a #

(<|>) :: MaybeK a -> MaybeK a -> MaybeK a #

some :: MaybeK a -> MaybeK [a] #

many :: MaybeK a -> MaybeK [a] #

MonadPlus MaybeK # 

Methods

mzero :: MaybeK a #

mplus :: MaybeK a -> MaybeK a -> MaybeK a #

MonadError () MaybeK # 

Methods

throwError :: () -> MaybeK a #

catchError :: MaybeK a -> (() -> MaybeK a) -> MaybeK a #

runMaybeK :: MaybeK a -> Maybe a #

Execute the MaybeK and return the concrete Maybe encoding.

toMaybeK :: Maybe a -> MaybeK a #

Lift a Maybe into MaybeK.

maybeK :: b -> (a -> b) -> MaybeK a -> b #

A version of maybe for convenience. This is almost identical to mplus but allows applying a continuation to Just values as well as handling Nothing errors. If you only want to handle the errors, use mplus instead.

The partiality monad transformer

data MaybeKT m a #

A monad transformer version of MaybeK.

Instances

MonadTrans MaybeKT # 

Methods

lift :: Monad m => m a -> MaybeKT m a #

(Applicative m, Monad m) => MonadError () (MaybeKT m) # 

Methods

throwError :: () -> MaybeKT m a #

catchError :: MaybeKT m a -> (() -> MaybeKT m a) -> MaybeKT m a #

Monad (MaybeKT m) # 

Methods

(>>=) :: MaybeKT m a -> (a -> MaybeKT m b) -> MaybeKT m b #

(>>) :: MaybeKT m a -> MaybeKT m b -> MaybeKT m b #

return :: a -> MaybeKT m a #

fail :: String -> MaybeKT m a #

Functor (MaybeKT m) # 

Methods

fmap :: (a -> b) -> MaybeKT m a -> MaybeKT m b #

(<$) :: a -> MaybeKT m b -> MaybeKT m a #

Applicative (MaybeKT m) # 

Methods

pure :: a -> MaybeKT m a #

(<*>) :: MaybeKT m (a -> b) -> MaybeKT m a -> MaybeKT m b #

(*>) :: MaybeKT m a -> MaybeKT m b -> MaybeKT m b #

(<*) :: MaybeKT m a -> MaybeKT m b -> MaybeKT m a #

(Applicative m, Monad m) => Alternative (MaybeKT m) # 

Methods

empty :: MaybeKT m a #

(<|>) :: MaybeKT m a -> MaybeKT m a -> MaybeKT m a #

some :: MaybeKT m a -> MaybeKT m [a] #

many :: MaybeKT m a -> MaybeKT m [a] #

(Applicative m, Monad m) => MonadPlus (MaybeKT m) # 

Methods

mzero :: MaybeKT m a #

mplus :: MaybeKT m a -> MaybeKT m a -> MaybeKT m a #

runMaybeKT :: Applicative m => MaybeKT m a -> m (Maybe a) #

Execute a MaybeKT and return the concrete Maybe encoding.

toMaybeKT :: Applicative m => Maybe a -> MaybeKT m a #

Lift a Maybe into an MaybeKT.

liftMaybeK :: Applicative m => MaybeK a -> MaybeKT m a #

Lift an MaybeK into an MaybeKT.

lowerMaybeK :: Applicative m => MaybeKT m a -> m (MaybeK a) #

Lower an MaybeKT into an MaybeK.