| Copyright | © Frank Jung 2024 |
|---|---|
| License | GPL-3.0-only |
| Safe Haskell | Safe-Inferred |
| Language | Haskell2010 |
Contravariant
Description
From Covariance, contravariance, and positive and negative position and What is a contravariant functor?
The implementation of the function-result fmap and the function-argument
contramap are almost exactly the same thing: just function composition
(the . operator). The only difference is on which side you compose the
adaptor function
fmap :: (r -> s) -> (a -> r) -> (a -> s) fmap adaptor f = adaptor . f fmap adaptor = (adaptor .) fmap = (.) contramap' :: (b -> a) -> (a -> r) -> (b -> r) contramap' adaptor f = f . adaptor contramap' adaptor = (. adaptor) contramap' = flip (.)
Note that contramap' is not the same as contramap from
Contravariant. As you can't make a '-> r' an actual instance of
Contravariant in Haskell code simply because the a is not the last type
parameter of (->). Conceptually it works perfectly well, and you can always
use a newtype wrapper to swap the type parameters and make that an instance
(the contravariant defines the the Op type for exactly this purpose).
Synopsis
- newtype MakeString a = MakeString {
- makeString :: a -> String
- plus3ShowInt :: MakeString Int
- showInt :: MakeString Int
Types
newtype MakeString a Source #
A contravariant functor.
Constructors
| MakeString | |
Fields
| |
Instances
| Contravariant MakeString Source # | Map covariant functor over |
Defined in Contravariant Methods contramap :: (a' -> a) -> MakeString a -> MakeString a' # (>$) :: b -> MakeString b -> MakeString a # | |
Functions
plus3ShowInt :: MakeString Int Source #
Show an integer plus 3.
Compare this with the following code:
plus3ShowInt = MakeString (show . (+ 3))
The contramap function is a more general way to compose the function.
showInt :: MakeString Int Source #
Show an integer.