# Profunctor A profunctor is similar to the [[Bifunctor]] in that it has two generic arguments, but unlike a bifunctor, which has two `map` operators, a profunctor has a `contramap` for its first type argument. That's why you can think of a profunctor as being both a [[Covariant Functor|Covariant Functor]] (on it's second argument) and a [[Contravariant Functor]] on its first argument. Think about this as a simple function (which is a profunctor). If you start with an `a -> b` function you can `contramap` it with `U -> a` to turn it into a `U -> b`. Similarly you can `map` it with `b -> V` to turn it into `a -> V`, or apply both to turn it into `U -> V`. It's all about the order you use when composing functions (in this case they are functions).