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 |
Data.Functor
Description
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
Expand
>>>
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.
Instances
Instances details
Instance details
Defined in Control.Arrow
Methods
fmap :: (a0 -> b) -> ArrowMonad a a0 -> ArrowMonad a b Source #
(<$) :: a0 -> ArrowMonad a b -> ArrowMonad a a0 Source #
Instance details
Defined in Control.Applicative
Methods
fmap :: (a -> b) -> WrappedMonad m a -> WrappedMonad m b Source #
(<$) :: a -> WrappedMonad m b -> WrappedMonad m a Source #
Instance details
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 f => f a -> b -> f b infixl 4 Source #
Flipped version of <$
.
Examples
Expand
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: 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
Expand
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.
Examples
Expand
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