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.Bind
Description
Synopsis
- class Functor (f :: Type -> Type ) where
- (<$>) :: Functor f => (a -> b) -> f a -> f b
- ($>) :: Functor f => f a -> b -> f b
- class Functor f => Apply f where
- (<..>) :: Apply w => w a -> w (a -> b) -> w b
- liftF3 :: Apply w => (a -> b -> c -> d) -> w a -> w b -> w c -> w d
-
newtype
WrappedApplicative
f a =
WrapApplicative
{
- unwrapApplicative :: f a
-
newtype
MaybeApply
f a =
MaybeApply
{
- runMaybeApply :: Either (f a) a
- class Apply m => Bind m where
- (-<<) :: Bind m => (a -> m b) -> m a -> m b
- (-<-) :: Bind m => (b -> m c) -> (a -> m b) -> a -> m c
- (->-) :: Bind m => (a -> m b) -> (b -> m c) -> a -> m c
- apDefault :: Bind f => f (a -> b) -> f a -> f b
- returning :: Functor f => f a -> (a -> b) -> f b
Functors
class Functor (f :: Type -> Type ) where Source #
A type
f
is a Functor if it provides a function
fmap
which, given any types
a
and
b
lets you apply any function from
(a -> b)
to turn an
f a
into an
f b
, preserving the
structure of
f
. Furthermore
f
needs to adhere to the following:
Note, that the second law follows from the free theorem of the type
fmap
and
the first law, so you need only check that the former condition holds.
Minimal complete definition
Methods
fmap :: (a -> b) -> f a -> f b Source #
Using
ApplicativeDo
: '
' can be understood as
the
fmap
f as
do
expression
do a <- as pure (f a)
with an inferred
Functor
constraint.
Instances
Functor [] |
Since: base-2.1 |
Functor Maybe |
Since: base-2.1 |
Functor IO |
Since: base-2.1 |
Functor Par1 |
Since: base-4.9.0.0 |
Functor Q | |
Functor Complex |
Since: base-4.9.0.0 |
Functor Min |
Since: base-4.9.0.0 |
Functor Max |
Since: base-4.9.0.0 |
Functor First |
Since: base-4.9.0.0 |
Functor Last |
Since: base-4.9.0.0 |
Functor Option |
Since: base-4.9.0.0 |
Functor ZipList |
Since: base-2.1 |
Functor Identity |
Since: base-4.8.0.0 |
Functor Handler |
Since: base-4.6.0.0 |
Functor STM |
Since: base-4.3.0.0 |
Functor First |
Since: base-4.8.0.0 |
Functor Last |
Since: base-4.8.0.0 |
Functor Dual |
Since: base-4.8.0.0 |
Functor Sum |
Since: base-4.8.0.0 |
Functor Product |
Since: base-4.8.0.0 |
Functor Down |
Since: base-4.11.0.0 |
Functor ReadP |
Since: base-2.1 |
Functor NonEmpty |
Since: base-4.9.0.0 |
Functor IntMap | |
Functor Tree | |
Functor Seq | |
Functor FingerTree | |
Defined in Data.Sequence.Internal Methods fmap :: (a -> b) -> FingerTree a -> FingerTree b Source # (<$) :: a -> FingerTree b -> FingerTree a Source # |
|
Functor Digit | |
Functor Node | |
Functor Elem | |
Functor ViewL | |
Functor ViewR | |
Functor Doc | |
Functor AnnotDetails | |
Defined in Text.PrettyPrint.Annotated.HughesPJ Methods fmap :: (a -> b) -> AnnotDetails a -> AnnotDetails b Source # (<$) :: a -> AnnotDetails b -> AnnotDetails a Source # |
|
Functor Span | |
Functor P |
Since: base-4.8.0.0 |
Functor ( Either a) |
Since: base-3.0 |
Functor ( V1 :: Type -> Type ) |
Since: base-4.9.0.0 |
Functor ( U1 :: Type -> Type ) |
Since: base-4.9.0.0 |
Functor ( (,) a) |
Since: base-2.1 |
Functor ( Array i) |
Since: base-2.1 |
Functor ( Arg a) |
Since: base-4.9.0.0 |
Monad m => Functor ( WrappedMonad m) |
Since: base-2.1 |
Defined in Control.Applicative Methods fmap :: (a -> b) -> WrappedMonad m a -> WrappedMonad m b Source # (<$) :: a -> WrappedMonad m b -> WrappedMonad m a Source # |
|
Arrow a => Functor ( ArrowMonad a) |
Since: base-4.6.0.0 |
Defined in Control.Arrow Methods fmap :: (a0 -> b) -> ArrowMonad a a0 -> ArrowMonad a b Source # (<$) :: a0 -> ArrowMonad a b -> ArrowMonad a a0 Source # |
|
Functor ( Proxy :: Type -> Type ) |
Since: base-4.7.0.0 |
Functor ( Map k) | |
Functor f => Functor ( Lift f) | |
Functor m => Functor ( MaybeT m) | |
Functor m => Functor ( ListT m) | |
Functor ( HashMap k) | |
Functor f => Functor ( MaybeApply f) Source # | |
Defined in Data.Functor.Bind.Class Methods fmap :: (a -> b) -> MaybeApply f a -> MaybeApply f b Source # (<$) :: a -> MaybeApply f b -> MaybeApply f a Source # |
|
Functor f => Functor ( WrappedApplicative f) Source # | |
Defined in Data.Functor.Bind.Class Methods fmap :: (a -> b) -> WrappedApplicative f a -> WrappedApplicative f b Source # (<$) :: a -> WrappedApplicative f b -> WrappedApplicative f a Source # |
|
Functor f => Functor ( Rec1 f) |
Since: base-4.9.0.0 |
Functor ( URec Char :: Type -> Type ) |
Since: base-4.9.0.0 |
Functor ( URec Double :: Type -> Type ) |
Since: base-4.9.0.0 |
Functor ( URec Float :: Type -> Type ) |
Since: base-4.9.0.0 |
Functor ( URec Int :: Type -> Type ) |
Since: base-4.9.0.0 |
Functor ( URec Word :: Type -> Type ) |
Since: base-4.9.0.0 |
Functor ( URec ( Ptr ()) :: Type -> Type ) |
Since: base-4.9.0.0 |
Functor ( (,,) a b) |
Since: base-4.14.0.0 |
Arrow a => Functor ( WrappedArrow a b) |
Since: base-2.1 |
Defined in Control.Applicative Methods fmap :: (a0 -> b0) -> WrappedArrow a b a0 -> WrappedArrow a b b0 Source # (<$) :: a0 -> WrappedArrow a b b0 -> WrappedArrow a b a0 Source # |
|
Functor m => Functor ( Kleisli m a) |
Since: base-4.14.0.0 |
Functor ( Const m :: Type -> Type ) |
Since: base-2.1 |
Functor f => Functor ( Ap f) |
Since: base-4.12.0.0 |
Functor f => Functor ( Alt f) |
Since: base-4.8.0.0 |
Bifunctor p => Functor ( Join p) | |
Functor w => Functor ( TracedT m w) | |
Functor w => Functor ( StoreT s w) | |
Functor w => Functor ( EnvT e w) | |
Functor m => Functor ( IdentityT m) | |
( Applicative f, Monad f) => Functor ( WhenMissing f x) |
Since: containers-0.5.9 |
Defined in Data.IntMap.Internal Methods fmap :: (a -> b) -> WhenMissing f x a -> WhenMissing f x b Source # (<$) :: a -> WhenMissing f x b -> WhenMissing f x a Source # |
|
Functor ( Tagged s) | |
Functor f => Functor ( Reverse f) |
Derived instance. |
Functor ( Constant a :: Type -> Type ) | |
Functor m => Functor ( WriterT w m) | |
Functor m => Functor ( WriterT w m) | |
Functor m => Functor ( WriterT w m) | |
Functor m => Functor ( StateT s m) | |
Functor m => Functor ( StateT s m) | |
Functor m => Functor ( ReaderT r m) | |
Functor m => Functor ( ExceptT e m) | |
Functor m => Functor ( ErrorT e m) | |
Functor f => Functor ( Backwards f) |
Derived instance. |
Functor (Mag a b) | |
Functor f => Functor ( Static f a) Source # | |
Functor ((->) r :: Type -> Type ) |
Since: base-2.1 |
Functor ( K1 i c :: Type -> Type ) |
Since: base-4.9.0.0 |
( Functor f, Functor g) => Functor (f :+: g) |
Since: base-4.9.0.0 |
( Functor f, Functor g) => Functor (f :*: g) |
Since: base-4.9.0.0 |
Functor ( (,,,) a b c) |
Since: base-4.14.0.0 |
( Functor f, Functor g) => Functor ( Product f g) |
Since: base-4.9.0.0 |
( Functor f, Functor g) => Functor ( Sum f g) |
Since: base-4.9.0.0 |
Functor ( Cokleisli w a) | |
Functor f => Functor ( WhenMatched f x y) |
Since: containers-0.5.9 |
Defined in Data.IntMap.Internal Methods fmap :: (a -> b) -> WhenMatched f x y a -> WhenMatched f x y b Source # (<$) :: a -> WhenMatched f x y b -> WhenMatched f x y a Source # |
|
( Applicative f, Monad f) => Functor ( WhenMissing f k x) |
Since: containers-0.5.9 |
Defined in Data.Map.Internal Methods fmap :: (a -> b) -> WhenMissing f k x a -> WhenMissing f k x b Source # (<$) :: a -> WhenMissing f k x b -> WhenMissing f k x a Source # |
|
Functor ( ContT r m) | |
Functor f => Functor ( M1 i c f) |
Since: base-4.9.0.0 |
( Functor f, Functor g) => Functor (f :.: g) |
Since: base-4.9.0.0 |
( Functor f, Functor g) => Functor ( Compose f g) |
Since: base-4.9.0.0 |
Bifunctor p => Functor ( WrappedBifunctor p a) | |
Defined in Data.Bifunctor.Wrapped Methods fmap :: (a0 -> b) -> WrappedBifunctor p a a0 -> WrappedBifunctor p a b Source # (<$) :: a0 -> WrappedBifunctor p a b -> WrappedBifunctor p a a0 Source # |
|
Functor g => Functor ( Joker g a) | |
Bifunctor p => Functor ( Flip p a) | |
Functor ( Clown f a :: Type -> Type ) | |
Functor f => Functor ( WhenMatched f k x y) |
Since: containers-0.5.9 |
Defined in Data.Map.Internal Methods fmap :: (a -> b) -> WhenMatched f k x y a -> WhenMatched f k x y b Source # (<$) :: a -> WhenMatched f k x y b -> WhenMatched f k x y a Source # |
|
Functor m => Functor ( RWST r w s m) | |
Functor m => Functor ( RWST r w s m) | |
Functor m => Functor ( RWST r w s m) | |
( Functor (f a), Functor (g a)) => Functor ( Product f g a) | |
( Functor f, Bifunctor p) => Functor ( Tannen f p a) | |
( Bifunctor p, Functor g) => Functor ( Biff p f g a) | |
(<$>) :: Functor f => (a -> b) -> f a -> f b infixl 4 Source #
An infix synonym for
fmap
.
The name of this operator is an allusion to
$
.
Note the similarities between their types:
($) :: (a -> b) -> a -> b (<$>) :: Functor f => (a -> b) -> f a -> f b
Whereas
$
is function application,
<$>
is function
application lifted over a
Functor
.
Examples
Convert from a
to a
Maybe
Int
using
Maybe
String
show
:
>>>
show <$> Nothing
Nothing>>>
show <$> Just 3
Just "3"
Convert from an
to an
Either
Int
Int
Either
Int
String
using
show
:
>>>
show <$> Left 17
Left 17>>>
show <$> Right 17
Right "17"
Double each element of a list:
>>>
(*2) <$> [1,2,3]
[2,4,6]
Apply
even
to the second element of a pair:
>>>
even <$> (2,2)
(2,True)
($>) :: Functor f => f a -> b -> f b infixl 4 Source #
Flipped version of
<$
.
Using
ApplicativeDo
: '
as
' can be understood as the
$>
b
do
expression
do as pure b
with an inferred
Functor
constraint.
Examples
Replace the contents of a
with a constant
Maybe
Int
String
:
>>>
Nothing $> "foo"
Nothing>>>
Just 90210 $> "foo"
Just "foo"
Replace the contents of an
with a constant
Either
Int
Int
String
, resulting in an
:
Either
Int
String
>>>
Left 8675309 $> "foo"
Left 8675309>>>
Right 8675309 $> "foo"
Right "foo"
Replace each element of a list with a constant
String
:
>>>
[1,2,3] $> "foo"
["foo","foo","foo"]
Replace the second element of a pair with a constant
String
:
>>>
(1,2) $> "foo"
(1,"foo")
Since: base-4.7.0.0
Applyable functors
class Functor f => Apply f where Source #
A strong lax semi-monoidal endofunctor.
This is equivalent to an
Applicative
without
pure
.
Laws:
(.
)<$>
u<.>
v<.>
w = u<.>
(v<.>
w) x<.>
(f<$>
y) = (.
f)<$>
x<.>
y f<$>
(x<.>
y) = (f.
)<$>
x<.>
y
The laws imply that
.>
and
<.
really ignore their
left and right results, respectively, and really
return their right and left results, respectively.
Specifically,
(mf<$>
m).>
(nf<$>
n) = nf<$>
(m.>
n) (mf<$>
m)<.
(nf<$>
n) = mf<$>
(m<.
n)
Methods
(<.>) :: f (a -> b) -> f a -> f b infixl 4 Source #
(.>) :: f a -> f b -> f b infixl 4 Source #
(<.) :: f a -> f b -> f a infixl 4 Source #
liftF2 :: (a -> b -> c) -> f a -> f b -> f c Source #
Lift a binary function into a comonad with zipping
Instances
(<..>) :: Apply w => w a -> w (a -> b) -> w b infixl 4 Source #
A variant of
<.>
with the arguments reversed.
liftF3 :: Apply w => (a -> b -> c -> d) -> w a -> w b -> w c -> w d Source #
Lift a ternary function into a comonad with zipping
Wrappers
newtype WrappedApplicative f a Source #
Wrap an
Applicative
to be used as a member of
Apply
Constructors
WrapApplicative | |
Fields
|
Instances
newtype MaybeApply f a Source #
Transform an Apply into an Applicative by adding a unit.
Constructors
MaybeApply | |
Fields
|
Instances
Bindable functors
class Apply m => Bind m where Source #
Minimal definition: Either
join
or
>>-
If defining both, then the following laws (the default definitions) must hold:
join = (>>- id) m >>- f = join (fmap f m)
Laws:
induced definition of <.>: f <.> x = f >>- (<$> x)
Finally, there are two associativity conditions:
associativity of (>>-): (m >>- f) >>- g == m >>- (\x -> f x >>- g) associativity of join: join . join = join . fmap join
These can both be seen as special cases of the constraint that
associativity of (->-): (f ->- g) ->- h = f ->- (g ->- h)