Copyright | (C) 2008-2016 Edward Kmett |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Stability | provisional |
Portability | non-portable (rank-2 polymorphism) |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
Synopsis
-
newtype
Codensity
(m :: k ->
TYPE
rep) a =
Codensity
{
- runCodensity :: forall b. (a -> m b) -> m b
- lowerCodensity :: Applicative f => Codensity f a -> f a
- codensityToAdjunction :: Adjunction f g => Codensity g a -> g (f a)
- adjunctionToCodensity :: Adjunction f g => g (f a) -> Codensity g a
- codensityToRan :: Codensity g a -> Ran g g a
- ranToCodensity :: Ran g g a -> Codensity g a
- codensityToComposedRep :: Representable u => Codensity u a -> u ( Rep u, a)
- composedRepToCodensity :: Representable u => u ( Rep u, a) -> Codensity u a
- wrapCodensity :: ( forall a. m a -> m a) -> Codensity m ()
- improve :: Functor f => ( forall m. MonadFree f m => m a) -> Free f a
- reset :: Monad m => Codensity m a -> Codensity m a
- shift :: Applicative m => ( forall b. (a -> m b) -> Codensity m b) -> Codensity m a
Documentation
newtype Codensity (m :: k -> TYPE rep) a Source #
is the Monad generated by taking the right Kan extension
of any
Codensity
f
Functor
f
along itself (
Ran f f
).
This can often be more "efficient" to construct than
f
itself using
repeated applications of
(>>=)
.
See "Asymptotic Improvement of Computations over Free Monads" by Janis Voigtländer for more information about this type.
https://www.janis-voigtlaender.eu/papers/AsymptoticImprovementOfComputationsOverFreeMonads.pdf
Codensity | |
|
Instances
lowerCodensity :: Applicative f => Codensity f a -> f a Source #
This serves as the *left*-inverse (retraction) of
lift
.
lowerCodensity
.lift
≡id
In general this is not a full 2-sided inverse, merely a retraction, as
is often considerably "larger" than
Codensity
m
m
.
e.g.
could support a full complement of
Codensity
((->) s)) a ~ forall r. (a -> s -> r) -> s -> r
actions, while
MonadState
s
(->) s
is limited to
actions.
MonadReader
s
codensityToAdjunction :: Adjunction f g => Codensity g a -> g (f a) Source #
The
Codensity
monad of a right adjoint is isomorphic to the
monad obtained from the
Adjunction
.
codensityToAdjunction
.adjunctionToCodensity
≡id
adjunctionToCodensity
.codensityToAdjunction
≡id
adjunctionToCodensity :: Adjunction f g => g (f a) -> Codensity g a Source #
codensityToRan :: Codensity g a -> Ran g g a Source #
The
Codensity
Monad
of a
Functor
g
is the right Kan extension (
Ran
)
of
g
along itself.
codensityToRan
.ranToCodensity
≡id
ranToCodensity
.codensityToRan
≡id
ranToCodensity :: Ran g g a -> Codensity g a Source #
codensityToComposedRep :: Representable u => Codensity u a -> u ( Rep u, a) Source #
The
Codensity
monad of a representable
Functor
is isomorphic to the
monad obtained from the
Adjunction
for which that
Functor
is the right
adjoint.
codensityToComposedRep
.composedRepToCodensity
≡id
composedRepToCodensity
.codensityToComposedRep
≡id
codensityToComposedRep =ranToComposedRep
.codensityToRan
composedRepToCodensity :: Representable u => u ( Rep u, a) -> Codensity u a Source #
wrapCodensity :: ( forall a. m a -> m a) -> Codensity m () Source #
Wrap the remainder of the
Codensity
action using the given
function.
This function can be used to register cleanup actions that will be executed at the end. Example:
wrapCodensity (`finally` putStrLn "Done.")
improve :: Functor f => ( forall m. MonadFree f m => m a) -> Free f a Source #
Right associate all binds in a computation that generates a free monad
This can improve the asymptotic efficiency of the result, while preserving semantics.
See "Asymptotic Improvement of Computations over Free Monads" by Janis Voightländer for more information about this combinator.