| Copyright | (c) Justin Le 2019 | 
|---|---|
| License | BSD3 | 
| Maintainer | justin@jle.im | 
| Stability | experimental | 
| Portability | non-portable | 
| Safe Haskell | Safe-Inferred | 
| Language | Haskell2010 | 
Data.Functor.Invariant.Night
Synopsis
- data Night :: (Type -> Type) -> (Type -> Type) -> Type -> Type where
- newtype Not a = Not {}
- refuted :: Not Void
- night :: f a -> g b -> Night f g (Either a b)
- runNight :: Inalt h => (f ~> h) -> (g ~> h) -> Night f g ~> h
- nerve :: Inalt f => Night f f ~> f
- runNightAlt :: forall f g h. Alt h => (f ~> h) -> (g ~> h) -> Night f g ~> h
- runNightDecide :: forall f g h. Decide h => (f ~> h) -> (g ~> h) -> Night f g ~> h
- toCoNight :: (Functor f, Functor g) => Night f g ~> (f :*: g)
- toCoNight_ :: Night f g ~> (Coyoneda f :*: Coyoneda g)
- toContraNight :: Night f g ~> Night f g
- assoc :: Night f (Night g h) ~> Night (Night f g) h
- unassoc :: Night (Night f g) h ~> Night f (Night g h)
- intro1 :: g ~> Night Not g
- intro2 :: f ~> Night f Not
- elim1 :: Invariant g => Night Not g ~> g
- elim2 :: Invariant f => Night f Not ~> f
- swapped :: Night f g ~> Night g f
- trans1 :: (f ~> h) -> Night f g ~> Night h g
- trans2 :: (g ~> h) -> Night f g ~> Night f h
Documentation
data Night :: (Type -> Type) -> (Type -> Type) -> Type -> Type where Source #
A pairing of invariant functors to create a new invariant functor that represents the "choice" between the two.
A Night f g aa, and
 it does this by either feeding the a to f, or feeding the a to
 g, and then collecting the result from whichever one it was fed to.
 Which decision of which path to takes happens at runtime depending
 what a is actually given.
For example, if we have x :: f a and y :: g b, then night x y ::
 Night f g (Either a b)Either a bLeft branches by feeding it to x, and Right branches
 by feeding it to y.  It then passes back the single result from the one of
 the two that was chosen.
Mathematically, this is a invariant day convolution, except with
 a different choice of bifunctor (Either) than the typical one we talk
 about in Haskell (which uses (,)).  Therefore, it is an alternative to
 the typical Day convolution --- hence, the name Night.
Instances
A value of type Not aa is uninhabited.
Instances
A useful shortcut for a common usage: Void is always not so.
Since: 0.3.1.0
toContraNight :: Night f g ~> Night f g Source #
Convert an invariant Night into the contravariant version, dropping
 the covariant part.