IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

Contravariant

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