Data.Functor.Contravariant
covariant functor ~~> produce something
contravariant functor ~~> consume something
(>$) = contramap . const
const :: a -> b -> a
contramap :: Contravariant f => (a -> b) -> f b -> f a
contrampa . const = x -> y -> x
(a -> b) -> f b -> f a
= x -> f b -> f a ( y = a , x = b )
= b -> f b -> f a
lambda > import Data.Functor.Contravariant
lambda > data Person = Person {balance :: Int}
lambda > let personBankBalance p = balance p
lambda > let negative = Predicate (\x -> x < 0)
lambda >
lambda > overdrawn = contramap personBankBalance negative :: Predicate Person
lambda >
lambda > getPredicate overdrawn (Person 5)
False
lambda > getPredicate overdrawn (Person (-10))
True
lambda >
lambda > overdrawn' = (>$) (-15) negative
lambda > getPredicate overdrawn' (Person 5)
True
lambda > getPredicate overdrawn' (Person (-10))
True