Copyright | (c) The University of Glasgow 2001 |
---|---|
License | BSD-style (see the file libraries/base/LICENSE) |
Maintainer | libraries@haskell.org |
Stability | provisional |
Portability | portable |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
A type f
is a Functor if it provides a function fmap
which, given any types a
and b
,
lets you apply any function of type (a -> b)
to turn an f a
into an f b
, preserving the
structure of f
.
Examples
>>>
fmap show (Just 1) -- (a -> b) -> f a -> f b
Just "1" -- (Int -> String) -> Maybe Int -> Maybe String
>>>
fmap show Nothing -- (a -> b) -> f a -> f b
Nothing -- (Int -> String) -> Maybe Int -> Maybe String
>>>
fmap show [1,2,3] -- (a -> b) -> f a -> f b
["1", "2", "3"] -- (Int -> String) -> [Int] -> [String]
>>>
fmap show [] -- (a -> b) -> f a -> f b
[] -- (Int -> String) -> [Int] -> [String]
The fmap
function is also available as the infix operator <$>
:
>>>
fmap show (Just 1) -- (Int -> String) -> Maybe Int -> Maybe String
Just "1">>>
show <$> (Just 1) -- (Int -> String) -> Maybe Int -> Maybe String
Just "1"
Documentation
class Functor f 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.
fmap :: (a -> b) -> f a -> f b Source #
Using ApplicativeDo
: '
' can be understood as
the fmap
f asdo
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 NonEmpty # | Since: base-4.9.0.0 |
Functor NoIO # | Since: base-4.8.0.0 |
Functor ReadP # | Since: base-2.1 |
Functor ReadPrec # | Since: base-2.1 |
Functor Down # | Since: base-4.11.0.0 |
Functor Product # | Since: base-4.8.0.0 |
Functor Sum # | Since: base-4.8.0.0 |
Functor Dual # | Since: base-4.8.0.0 |
Functor Last # | Since: base-4.8.0.0 |
Functor First # | Since: base-4.8.0.0 |
Functor STM # | Since: base-4.3.0.0 |
Functor Handler # | Since: base-4.6.0.0 |
Functor Identity # | Since: base-4.8.0.0 |
Functor ZipList # | Since: base-2.1 |
Functor ArgDescr # | Since: base-4.6.0.0 |
Functor OptDescr # | Since: base-4.6.0.0 |
Functor ArgOrder # | Since: base-4.6.0.0 |
Functor Option # | Since: base-4.9.0.0 |
Functor Last # | Since: base-4.9.0.0 |
Functor First # | Since: base-4.9.0.0 |
Functor Max # | Since: base-4.9.0.0 |
Functor Min # | Since: base-4.9.0.0 |
Functor Complex # | Since: base-4.9.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 (ST s) # | Since: base-2.1 |
Functor (Array i) # | Since: base-2.1 |
Functor (Proxy :: Type -> Type) # | Since: base-4.7.0.0 |
Arrow a => Functor (ArrowMonad a) # | Since: base-4.6.0.0 |
Defined in Control.Arrow fmap :: (a0 -> b) -> ArrowMonad a a0 -> ArrowMonad a b Source # (<$) :: a0 -> ArrowMonad a b -> ArrowMonad a a0 Source # | |
Monad m => Functor (WrappedMonad m) # | Since: base-2.1 |
Defined in Control.Applicative fmap :: (a -> b) -> WrappedMonad m a -> WrappedMonad m b Source # (<$) :: a -> WrappedMonad m b -> WrappedMonad m a Source # | |
Functor (ST s) # | Since: base-2.1 |
Functor (Arg a) # | Since: base-4.9.0.0 |
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 |
Functor f => Functor (Alt f) # | Since: base-4.8.0.0 |
Functor f => Functor (Ap f) # | Since: base-4.12.0.0 |
Functor (Const m :: Type -> Type) # | Since: base-2.1 |
Functor m => Functor (Kleisli m a) # | Since: base-4.14.0.0 |
Arrow a => Functor (WrappedArrow a b) # | Since: base-2.1 |
Defined in Control.Applicative fmap :: (a0 -> b0) -> WrappedArrow a b a0 -> WrappedArrow a b b0 Source # (<$) :: a0 -> WrappedArrow a b b0 -> WrappedArrow a b a0 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 (Sum f g) # | Since: base-4.9.0.0 |
(Functor f, Functor g) => Functor (Product f g) # | Since: base-4.9.0.0 |
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 |
($>) :: Functor f => f a -> b -> f b infixl 4 Source #
Flipped version of <$
.
Using ApplicativeDo
: 'as
' can be understood as the
$>
bdo
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
(<$>) :: 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)
void :: Functor f => f a -> f () Source #
discards or ignores the result of evaluation, such
as the return value of an void
valueIO
action.
Using ApplicativeDo
: '
' can be understood as the
void
asdo
expression
do as pure ()
with an inferred Functor
constraint.
Examples
Replace the contents of a
with unit:Maybe
Int
>>>
void Nothing
Nothing>>>
void (Just 3)
Just ()
Replace the contents of an
with unit, resulting in an Either
Int
Int
:Either
Int
'()'
>>>
void (Left 8675309)
Left 8675309>>>
void (Right 8675309)
Right ()
Replace every element of a list with unit:
>>>
void [1,2,3]
[(),(),()]
Replace the second element of a pair with unit:
>>>
void (1,2)
(1,())
Discard the result of an IO
action:
>>>
mapM print [1,2]
1 2 [(),()]>>>
void $ mapM print [1,2]
1 2