Copyright | (C) 2011-2015 Edward Kmett |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Stability | provisional |
Portability | portable |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
Data.Functor.Extend
Contents
Description
Synopsis
- class Functor w => Extend w where
- duplicated :: w a -> w (w a)
- extended :: (w a -> b) -> w a -> w b
- gduplicated :: (Extend (Rep1 w), Generic1 w) => w a -> w (w a)
- gextended :: (Extend (Rep1 w), Generic1 w) => (w a -> b) -> w a -> w b
Extendable Functors
There are two ways to define an Extend
instance:
I. Provide definitions for extended
satisfying this law:
extended f . extended g = extended (f . extended g)
II. Alternately, you may choose to provide definitions for duplicated
satisfying this law:
duplicated . duplicated = fmap duplicated . duplicated
You may of course, choose to define both duplicated
and extended
.
In that case you must also satisfy these laws:
extended f = fmap f . duplicated duplicated = extended id
These are the default definitions of extended
and duplicated
.
class Functor w => Extend w where #
Minimal complete definition
Methods
duplicated :: w a -> w (w a) #
duplicated = extended id fmap (fmap f) . duplicated = duplicated . fmap f
extended :: (w a -> b) -> w a -> w b #
extended f = fmap f . duplicated
Instances
Extend Identity # | |
Defined in Data.Functor.Extend Methods duplicated :: Identity a -> Identity (Identity a) # | |
Extend First # | |
Defined in Data.Functor.Extend | |
Extend Last # | |
Defined in Data.Functor.Extend | |
Extend Max # | |
Defined in Data.Functor.Extend | |
Extend Min # | |
Defined in Data.Functor.Extend | |
Extend Dual # | |
Defined in Data.Functor.Extend | |
Extend Product # | |
Defined in Data.Functor.Extend Methods duplicated :: Product a -> Product (Product a) # | |
Extend Sum # | |
Defined in Data.Functor.Extend | |
Extend NonEmpty # | |
Defined in Data.Functor.Extend Methods duplicated :: NonEmpty a -> NonEmpty (NonEmpty a) # | |
Extend Par1 # | |
Defined in Data.Functor.Extend | |
Extend Seq # | |
Defined in Data.Functor.Extend | |
Extend Tree # | |
Defined in Data.Functor.Extend | |
Extend Maybe # | |
Defined in Data.Functor.Extend | |
Extend List # | |
Defined in Data.Functor.Extend | |
Extend (Either a) # | |
Defined in Data.Functor.Extend Methods duplicated :: Either a a0 -> Either a (Either a a0) # extended :: (Either a a0 -> b) -> Either a a0 -> Either a b # | |
Extend (Proxy :: Type -> Type) # | |
Defined in Data.Functor.Extend | |
Extend (U1 :: Type -> Type) # | |
Defined in Data.Functor.Extend | |
Extend (V1 :: Type -> Type) # | |
Defined in Data.Functor.Extend | |
Extend f => Extend (MaybeApply f) # | |
Defined in Data.Functor.Bind.Class Methods duplicated :: MaybeApply f a -> MaybeApply f (MaybeApply f a) # extended :: (MaybeApply f a -> b) -> MaybeApply f a -> MaybeApply f b # | |
Extend ((,) e) # | |
Defined in Data.Functor.Extend | |
Extend f => Extend (Alt f) # | |
Defined in Data.Functor.Extend | |
Extend f => Extend (Rec1 f) # | |
Defined in Data.Functor.Extend Methods duplicated :: Rec1 f a -> Rec1 f (Rec1 f a) # | |
Extend w => Extend (EnvT e w) # | |
Extend w => Extend (StoreT s w) # | |
(Extend w, Semigroup m) => Extend (TracedT m w) # | |
(Extend f, Semigroup a) => Extend (Static f a) # | |
Extend (Tagged a) # | |
Extend w => Extend (IdentityT w) # | |
(Extend f, Extend g) => Extend (Sum f g) # | |
Defined in Data.Functor.Extend Methods duplicated :: Sum f g a -> Sum f g (Sum f g a) # | |
(Extend f, Extend g) => Extend (f :+: g) # | |
Defined in Data.Functor.Extend Methods duplicated :: (f :+: g) a -> (f :+: g) ((f :+: g) a) # extended :: ((f :+: g) a -> b) -> (f :+: g) a -> (f :+: g) b # | |
Extend (K1 i c :: Type -> Type) # | Since: 5.3.8 |
Defined in Data.Functor.Extend Methods duplicated :: K1 i c a -> K1 i c (K1 i c a) # | |
Semigroup m => Extend ((->) m) # | |
Defined in Data.Functor.Extend | |
Extend f => Extend (M1 i t f) # | |
Defined in Data.Functor.Extend Methods duplicated :: M1 i t f a -> M1 i t f (M1 i t f a) # |
gduplicated :: (Extend (Rep1 w), Generic1 w) => w a -> w (w a) #
Generic duplicated
. Caveats:
- Will not compile if
w
is a product type. - Will not compile if
w
contains fields where the type variable appears underneath the composition of type constructors (e.g.,f (g a)
).
Since: 5.3.8
gextended :: (Extend (Rep1 w), Generic1 w) => (w a -> b) -> w a -> w b #
Generic extended
. Caveats are the same as for gduplicated
.
Since: 5.3.8