Copyright | (C) 2012-2015 Nicolas Frisby, (C) 2015 Ryan Scott |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Ryan Scott |
Portability | Portable |
Safe Haskell | None |
Language | Haskell98 |
Haskell98 invariant functors (also known as exponential functors).
For more information, see Edward Kmett's article "Rotten Bananas":
- class Invariant f where
- invmap :: (a -> b) -> (b -> a) -> f a -> f b
- invmapFunctor :: Functor f => (a -> b) -> (b -> a) -> f a -> f b
- newtype WrappedFunctor f a = WrapFunctor {
- unwrapFunctor :: f a
- invmapContravariant :: Contravariant f => (a -> b) -> (b -> a) -> f a -> f b
- newtype WrappedContravariant f a = WrapContravariant {
- unwrapContravariant :: f a
- class Invariant2 f where
- invmap2 :: (a -> c) -> (c -> a) -> (b -> d) -> (d -> b) -> f a b -> f c d
- invmap2Bifunctor :: Bifunctor f => (a -> c) -> (c -> a) -> (b -> d) -> (d -> b) -> f a b -> f c d
- newtype WrappedBifunctor p a b :: (* -> * -> *) -> * -> * -> * = WrapBifunctor {
- unwrapBifunctor :: p a b
- invmap2Profunctor :: Profunctor f => (a -> c) -> (c -> a) -> (b -> d) -> (d -> b) -> f a b -> f c d
- newtype WrappedProfunctor p a b = WrapProfunctor {
- unwrapProfunctor :: p a b
Invariant
class Invariant f where Source
Any * -> *
type parametric in the argument permits an instance of
Invariant
.
Instances should satisfy the following laws:
invmap id id = id invmap f2 f2' . invmap f1 f1' = invmap (f2 . f1) (f1' . f2')
Invariant [] | |
Invariant IO | |
Invariant V1 | from |
Invariant U1 | from |
Invariant Par1 | from |
Invariant ArgOrder | from |
Invariant OptDescr | from |
Invariant ArgDescr | from |
Invariant ZipList | from |
Invariant Handler | from |
Invariant STM | from the |
Invariant Dual | from |
Invariant Endo | from |
Invariant First | from |
Invariant Last | from |
Invariant ReadPrec | |
Invariant ReadP | |
Invariant Maybe | |
Invariant Identity | from |
Invariant IntMap | from the |
Invariant Tree | from the |
Invariant Seq | from the |
Invariant ViewL | from the |
Invariant ViewR | from the |
Invariant Predicate | from the |
Invariant Comparison | from the |
Invariant Equivalence | from the |
Invariant Min | from the |
Invariant Max | from the |
Invariant First | from the |
Invariant Last | from the |
Invariant Option | from the |
Invariant NonEmpty | from the |
Invariant ((->) a) | |
Invariant (Either a) | |
Invariant f => Invariant (Rec1 f) | from |
Invariant ((,) a) | |
Invariant (ST s) | |
Ix i => Invariant (Array i) | from the |
Invariant (Const a) | from |
Monad m => Invariant (WrappedMonad m) | from |
Invariant (ST s) | |
Arrow a => Invariant (ArrowMonad a) | from |
Invariant (Proxy *) | from |
Invariant2 p => Invariant (Join p) | from the |
Invariant m => Invariant (IdentityT m) | from the |
Invariant (Map k) | from the |
Invariant (Op a) | from the |
Invariant (Arg a) | from the |
Invariant f => Invariant (Reverse f) | from the |
Invariant f => Invariant (Backwards f) | from the |
Invariant m => Invariant (MaybeT m) | from the |
Invariant m => Invariant (ListT m) | from the |
Invariant f => Invariant (Lift f) | from the |
Invariant (Constant a) | from the |
Invariant (HashMap k) | from the |
Contravariant f => Invariant (WrappedContravariant f) | |
Functor f => Invariant (WrappedFunctor f) | |
Invariant (K1 i c) | from |
(Invariant l, Invariant r) => Invariant ((:+:) l r) | from |
(Invariant l, Invariant r) => Invariant ((:*:) l r) | from |
(Invariant f, Invariant g) => Invariant ((:.:) f g) | from |
Invariant ((,,) a b) | |
Arrow arr => Invariant (WrappedArrow arr a) | from |
Bifunctor p => Invariant (WrappedBifunctor p a) | from the |
Invariant g => Invariant (Joker g a) | from the |
Invariant2 p => Invariant (Flip p a) | from the |
Invariant (Clown f a) | from the |
(Invariant f, Invariant g) => Invariant (Compose f g) | from the |
(Invariant f, Invariant g) => Invariant (ComposeFC f g) | from the |
(Invariant f, Invariant g) => Invariant (ComposeCF f g) | from the |
(Invariant f, Invariant g) => Invariant (Compose f g) | from the |
Invariant2 p => Invariant (Tambara p a) | from the |
Invariant2 p => Invariant (Cotambara p a) | from the |
Invariant2 p => Invariant (Codensity p a) | from the |
Invariant2 p => Invariant (Closure p a) | from the |
Invariant f => Invariant (Star f a) | from the |
Invariant (Costar f a) | from the |
Arrow arr => Invariant (WrappedArrow arr a) | from the |
Invariant (Forget r a) | from the |
Invariant (Tagged * s) | from the |
(Invariant f, Invariant g) => Invariant (Sum f g) | from the |
(Invariant f, Invariant g) => Invariant (Product f g) | from the |
Invariant m => Invariant (WriterT w m) | from the |
Invariant m => Invariant (WriterT w m) | from the |
Invariant m => Invariant (ErrorT e m) | |
Invariant m => Invariant (ExceptT e m) | from the |
Invariant m => Invariant (StateT s m) | from the |
Invariant m => Invariant (StateT s m) | from the |
Invariant m => Invariant (ReaderT r m) | from the |
Invariant (ContT r m) | from the |
Profunctor p => Invariant (WrappedProfunctor p a) | |
Invariant f => Invariant (M1 i t f) | from |
Invariant ((,,,) a b c) | |
(Invariant f, Invariant2 p) => Invariant (Tannen f p a) | from the |
Invariant2 q => Invariant (Ran p q a) | from the |
Invariant2 p => Invariant (Procompose p q a) | from the |
Invariant2 p => Invariant (Rift p q a) | from the |
Invariant ((,,,,) a b c d) | |
(Invariant2 p, Invariant g) => Invariant (Biff p f g a) | from the |
Invariant m => Invariant (RWST r w s m) | from the |
Invariant m => Invariant (RWST r w s m) | from the |
invmapFunctor :: Functor f => (a -> b) -> (b -> a) -> f a -> f b Source
newtype WrappedFunctor f a Source
WrapFunctor | |
|
Alternative f => Alternative (WrappedFunctor f) | |
Monad m => Monad (WrappedFunctor m) | |
Functor f => Functor (WrappedFunctor f) | |
MonadPlus m => MonadPlus (WrappedFunctor m) | |
Applicative f => Applicative (WrappedFunctor f) | |
Foldable f => Foldable (WrappedFunctor f) | |
Traversable f => Traversable (WrappedFunctor f) | |
Functor f => Invariant (WrappedFunctor f) | |
Eq (f a) => Eq (WrappedFunctor f a) | |
Ord (f a) => Ord (WrappedFunctor f a) | |
Read (f a) => Read (WrappedFunctor f a) | |
Show (f a) => Show (WrappedFunctor f a) |
invmapContravariant :: Contravariant f => (a -> b) -> (b -> a) -> f a -> f b Source
Every Contravariant
functor is also an Invariant
functor.
newtype WrappedContravariant f a Source
Wrap a Contravariant
functor to be used as a member of Invariant
.
Divisible f => Divisible (WrappedContravariant f) | |
Decidable f => Decidable (WrappedContravariant f) | |
Contravariant f => Contravariant (WrappedContravariant f) | |
Contravariant f => Invariant (WrappedContravariant f) | |
Eq (f a) => Eq (WrappedContravariant f a) | |
Ord (f a) => Ord (WrappedContravariant f a) | |
Read (f a) => Read (WrappedContravariant f a) | |
Show (f a) => Show (WrappedContravariant f a) |
GHC.Generics
Note: The restriction to Haskell98 prevents the full adoption of
GHC.Generics, but we are permitted to at least provide Invariant
instances for the representation data types. Thus, while the "ideal"
instance Invariant f => Invariant
(T f)
doesn't work --- because Haskell98 precludes our use of
-XDefaultSignatures
in the class definition ---, the user only needs
to do slightly more work:
import GHC.Generics (from1,to1) instance Invariant f =>Invariant
(T f) where invmap f g =to1
.invmap
f g .from1
Note also that that instance is in fact Haskell98. Unfortunately, one
would require -XFlexibleContexts
in order to factor that right-hand
side out as reusable declaration polymorphic in the data type.
Invariant2
class Invariant2 f where Source
Any * -> * -> *
type parametric in both arguments permits an instance of
Invariant2
.
Instances should satisfy the following laws:
invmap2 id id id id = id invmap2 f2 f2' g2 g2' . invmap2 f1 f1' g1 g1' = invmap2 (f2 . f1) (f1' . f2') (g2 . g1) (g1' . g2')
Invariant2 (->) | |
Invariant2 Either | |
Invariant2 (,) | |
Invariant2 Const | from |
Invariant2 Op | from the |
Invariant2 Arg | from the |
Invariant2 Constant | from the |
Invariant2 (K1 i) | from |
Invariant2 ((,,) a) | |
Arrow arr => Invariant2 (WrappedArrow arr) | from |
Bifunctor p => Invariant2 (WrappedBifunctor p) | from the |
Invariant g => Invariant2 (Joker g) | from the |
Invariant2 p => Invariant2 (Flip p) | from the |
Invariant f => Invariant2 (Clown f) | from the |
Invariant2 p => Invariant2 (Tambara p) | from the |
Invariant2 (Pastro p) | from the |
Invariant2 p => Invariant2 (Cotambara p) | from the |
Invariant2 (Copastro p) | from the |
Invariant2 p => Invariant2 (Codensity p) | from the |
Invariant2 p => Invariant2 (Closure p) | from the |
Invariant2 (Environment p) | from the |
Invariant f => Invariant2 (Star f) | from the |
Invariant f => Invariant2 (Costar f) | from the |
Arrow arr => Invariant2 (WrappedArrow arr) | from the |
Invariant2 (Forget r) | from the |
Invariant2 (Tagged *) | from the |
Profunctor p => Invariant2 (WrappedProfunctor p) | |
Invariant2 ((,,,) a b) | |
(Invariant f, Invariant2 p) => Invariant2 (Tannen f p) | from the |
(Invariant2 f, Invariant2 g) => Invariant2 (Product f g) | from the |
(Invariant2 p, Invariant2 q) => Invariant2 (Ran p q) | from the |
(Invariant2 p, Invariant2 q) => Invariant2 (Procompose p q) | from the |
(Invariant2 p, Invariant2 q) => Invariant2 (Rift p q) | from the |
(Invariant f, Invariant2 p) => Invariant2 (Cayley f p) | from the |
Invariant2 ((,,,,) a b c) | |
(Invariant2 p, Invariant f, Invariant g) => Invariant2 (Biff p f g) | from the |
invmap2Bifunctor :: Bifunctor f => (a -> c) -> (c -> a) -> (b -> d) -> (d -> b) -> f a b -> f c d Source
Every Bifunctor
is also an Invariant2
functor.
newtype WrappedBifunctor p a b :: (* -> * -> *) -> * -> * -> *
WrapBifunctor | |
|
Biapplicative p => Biapplicative (WrappedBifunctor p) | |
Bitraversable p => Bitraversable (WrappedBifunctor p) | |
Bifunctor p => Bifunctor (WrappedBifunctor p) | |
Bifoldable p => Bifoldable (WrappedBifunctor p) | |
Bifunctor p => Invariant2 (WrappedBifunctor p) | from the |
Bifunctor p => Functor (WrappedBifunctor p a) | |
Bifoldable p => Foldable (WrappedBifunctor p a) | |
Bitraversable p => Traversable (WrappedBifunctor p a) | |
Bifunctor p => Invariant (WrappedBifunctor p a) | from the |
Eq (p a b) => Eq (WrappedBifunctor p a b) | |
Ord (p a b) => Ord (WrappedBifunctor p a b) | |
Read (p a b) => Read (WrappedBifunctor p a b) | |
Show (p a b) => Show (WrappedBifunctor p a b) |
invmap2Profunctor :: Profunctor f => (a -> c) -> (c -> a) -> (b -> d) -> (d -> b) -> f a b -> f c d Source
Every Profunctor
is also an Invariant2
functor.
newtype WrappedProfunctor p a b Source
Wrap a Profunctor
to be used as a member of Invariant2
.
WrapProfunctor | |
|
Closed p => Closed (WrappedProfunctor p) | |
Strong p => Strong (WrappedProfunctor p) | |
Choice p => Choice (WrappedProfunctor p) | |
Costrong p => Costrong (WrappedProfunctor p) | |
Cochoice p => Cochoice (WrappedProfunctor p) | |
Profunctor p => Profunctor (WrappedProfunctor p) | |
Profunctor p => Invariant2 (WrappedProfunctor p) | |
Profunctor p => Invariant (WrappedProfunctor p a) | |
Eq (p a b) => Eq (WrappedProfunctor p a b) | |
Ord (p a b) => Ord (WrappedProfunctor p a b) | |
Read (p a b) => Read (WrappedProfunctor p a b) | |
Show (p a b) => Show (WrappedProfunctor p a b) |