úÎJ-     portable provisionalEdward Kmett <ekmett@gmail.com> Safe-Inferred Dual function arrows. Define an equivalence relation *Defines a total ordering on a type as per  6Any instance should be subject to the following laws:   contramap id = id / contramap f . contramap g = contramap (g . f) GNote, that the second law follows from the free theorem of the type of   ; and the first law, so you need only check that the former  condition holds. Compare using  Check for equivalence with  Control.Applicative.Const Data.Functor.Constant Data.Functor.Product Equivalence relations are  , because you can B apply the contramapped function to each input to the equivalence  relation. !A  is a   " , because   can @ apply its function argument to each input to each input to the  comparison function. #A   is a   " , because   can < apply its function argument to the input of the predicate.  $% !#      $% !#portable experimentalekmett@gmail.com Safe-Inferred4Composition of contravariant and covariant functors 4Composition of covariant and contravariant functors *Composition of two contravariant functors &'(  &'()       !"#$%&'()contravariant-0.2.0.2Data.Functor.Contravariant"Data.Functor.Contravariant.ComposeOpgetOp EquivalencegetEquivalence Comparison getComparison Predicate getPredicate Contravariant contramap>$<>$$<defaultComparisondefaultEquivalence ComposeCF getComposeCF ComposeFC getComposeFCCompose getComposeghc-prim GHC.Classescompare==$fContravariantConst$fContravariantConstant$fContravariantProduct$fContravariantEquivalence$fContravariantComparisonbaseGHC.BaseFunctor$fContravariantPredicate$fContravariantOp $fCategoryOp$fContravariantComposeCF$fContravariantComposeFC$fFunctorCompose