{-# LANGUAGE EmptyCase #-}{-# LANGUAGE GeneralizedNewtypeDeriving #-}{-# LANGUAGE StandaloneDeriving #-}{-# LANGUAGE Trustworthy #-}{-# LANGUAGE TypeOperators #-}------------------------------------------------------------------------------- |-- Module : Data.Functor.Contravariant-- Copyright : (C) 2007-2015 Edward Kmett-- License : BSD-style (see the file LICENSE)---- Maintainer : libraries@haskell.org-- Stability : provisional-- Portability : portable---- 'Contravariant' functors, sometimes referred to colloquially as @Cofunctor@,-- even though the dual of a 'Functor' is just a 'Functor'. As with 'Functor'-- the definition of 'Contravariant' for a given ADT is unambiguous.---- @since 4.12.0.0----------------------------------------------------------------------------moduleData.Functor.Contravariant(-- * Contravariant FunctorsContravariant (..),phantom -- * Operators,(>$<) ,(>$$<) ,($<) -- * Predicates,Predicate (..)-- * Comparisons,Comparison (..),defaultComparison -- * Equivalence Relations,Equivalence (..),defaultEquivalence ,comparisonEquivalence -- * Dual arrows,Op (..))whereimportControl.Applicative importControl.Category importData.Function (on )importData.Functor.Product importData.Functor.Sum importData.Functor.Compose importData.Monoid (Alt (..))importData.Proxy importGHC.Generics importPrelude hiding((.) ,id )-- | The class of contravariant functors.---- Whereas in Haskell, one can think of a 'Functor' as containing or producing-- values, a contravariant functor is a functor that can be thought of as-- /consuming/ values.---- As an example, consider the type of predicate functions @a -> Bool@. One-- such predicate might be @negative x = x < 0@, which-- classifies integers as to whether they are negative. However, given this-- predicate, we can re-use it in other situations, providing we have a way to-- map values /to/ integers. For instance, we can use the @negative@ predicate-- on a person's bank balance to work out if they are currently overdrawn:---- @-- newtype Predicate a = Predicate { getPredicate :: a -> Bool }---- instance Contravariant Predicate where-- contramap f (Predicate p) = Predicate (p . f)-- | `- First, map the input...-- `----- then apply the predicate.---- overdrawn :: Predicate Person-- overdrawn = contramap personBankBalance negative-- @---- Any instance should be subject to the following laws:---- [Identity] @'contramap' 'id' = 'id'@-- [Composition] @'contramap' (g . f) = 'contramap' f . 'contramap' g@---- Note, that the second law follows from the free theorem of the type of-- 'contramap' and the first law, so you need only check that the former-- condition holds.classContravariant f wherecontramap ::(a ->b )->f b ->f a -- | Replace all locations in the output with the same value.-- The default definition is @'contramap' . 'const'@, but this may be-- overridden with a more efficient version.(>$) ::b ->f b ->f a (>$) =(a -> b) -> f b -> f a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap ((a -> b) -> f b -> f a) -> (b -> a -> b) -> b -> f b -> f a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a -> b forall a b. a -> b -> a const -- | If @f@ is both 'Functor' and 'Contravariant' then by the time you factor-- in the laws of each of those classes, it can't actually use its argument in-- any meaningful capacity.---- This method is surprisingly useful. Where both instances exist and are-- lawful we have the following laws:---- @-- 'fmap' f ≡ 'phantom'-- 'contramap' f ≡ 'phantom'-- @phantom ::(Functor f ,Contravariant f )=>f a ->f b phantom :: f a -> f b phantom f a x =()() -> f a -> f () forall (f :: * -> *) a b. Functor f => a -> f b -> f a <$ f a x f () -> () -> f b forall (f :: * -> *) b a. Contravariant f => f b -> b -> f a $< ()infixl4>$ ,$< ,>$< ,>$$< -- | This is '>$' with its arguments flipped.($<) ::Contravariant f =>f b ->b ->f a $< :: f b -> b -> f a ($<) =(b -> f b -> f a) -> f b -> b -> f a forall a b c. (a -> b -> c) -> b -> a -> c flip b -> f b -> f a forall (f :: * -> *) b a. Contravariant f => b -> f b -> f a (>$) -- | This is an infix alias for 'contramap'.(>$<) ::Contravariant f =>(a ->b )->f b ->f a >$< :: (a -> b) -> f b -> f a (>$<) =(a -> b) -> f b -> f a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap -- | This is an infix version of 'contramap' with the arguments flipped.(>$$<) ::Contravariant f =>f b ->(a ->b )->f a >$$< :: f b -> (a -> b) -> f a (>$$<) =((a -> b) -> f b -> f a) -> f b -> (a -> b) -> f a forall a b c. (a -> b -> c) -> b -> a -> c flip (a -> b) -> f b -> f a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap derivinginstanceContravariant f =>Contravariant (Alt f )derivinginstanceContravariant f =>Contravariant (Rec1 f )derivinginstanceContravariant f =>Contravariant (M1 i c f )instanceContravariant V1 wherecontramap :: (a -> b) -> V1 b -> V1 a contramap a -> b _V1 b x =caseV1 b x ofinstanceContravariant U1 wherecontramap :: (a -> b) -> U1 b -> U1 a contramap a -> b _U1 b _=U1 a forall k (p :: k). U1 p U1 instanceContravariant (K1 i c )wherecontramap :: (a -> b) -> K1 i c b -> K1 i c a contramap a -> b _(K1 c c )=c -> K1 i c a forall k i c (p :: k). c -> K1 i c p K1 c c instance(Contravariant f ,Contravariant g )=>Contravariant (f :*: g )wherecontramap :: (a -> b) -> (:*:) f g b -> (:*:) f g a contramap a -> b f (f b xs :*: g b ys )=(a -> b) -> f b -> f a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap a -> b f f b xs f a -> g a -> (:*:) f g a forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> g p -> (:*:) f g p :*: (a -> b) -> g b -> g a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap a -> b f g b ys instance(Functor f ,Contravariant g )=>Contravariant (f :.: g )wherecontramap :: (a -> b) -> (:.:) f g b -> (:.:) f g a contramap a -> b f (Comp1 f (g b) fg )=f (g a) -> (:.:) f g a forall k2 k1 (f :: k2 -> *) (g :: k1 -> k2) (p :: k1). f (g p) -> (:.:) f g p Comp1 ((g b -> g a) -> f (g b) -> f (g a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap ((a -> b) -> g b -> g a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap a -> b f )f (g b) fg )instance(Contravariant f ,Contravariant g )=>Contravariant (f :+: g )wherecontramap :: (a -> b) -> (:+:) f g b -> (:+:) f g a contramap a -> b f (L1 f b xs )=f a -> (:+:) f g a forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p L1 ((a -> b) -> f b -> f a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap a -> b f f b xs )contramap a -> b f (R1 g b ys )=g a -> (:+:) f g a forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p R1 ((a -> b) -> g b -> g a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap a -> b f g b ys )instance(Contravariant f ,Contravariant g )=>Contravariant (Sum f g )wherecontramap :: (a -> b) -> Sum f g b -> Sum f g a contramap a -> b f (InL f b xs )=f a -> Sum f g a forall k (f :: k -> *) (g :: k -> *) (a :: k). f a -> Sum f g a InL ((a -> b) -> f b -> f a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap a -> b f f b xs )contramap a -> b f (InR g b ys )=g a -> Sum f g a forall k (f :: k -> *) (g :: k -> *) (a :: k). g a -> Sum f g a InR ((a -> b) -> g b -> g a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap a -> b f g b ys )instance(Contravariant f ,Contravariant g )=>Contravariant (Product f g )wherecontramap :: (a -> b) -> Product f g b -> Product f g a contramap a -> b f (Pair f b a g b b )=f a -> g a -> Product f g a forall k (f :: k -> *) (g :: k -> *) (a :: k). f a -> g a -> Product f g a Pair ((a -> b) -> f b -> f a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap a -> b f f b a )((a -> b) -> g b -> g a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap a -> b f g b b )instanceContravariant (Const a )wherecontramap :: (a -> b) -> Const a b -> Const a a contramap a -> b _(Const a a )=a -> Const a a forall k a (b :: k). a -> Const a b Const a a instance(Functor f ,Contravariant g )=>Contravariant (Compose f g )wherecontramap :: (a -> b) -> Compose f g b -> Compose f g a contramap a -> b f (Compose f (g b) fga )=f (g a) -> Compose f g a forall k k (f :: k -> *) (g :: k -> k) (a :: k). f (g a) -> Compose f g a Compose ((g b -> g a) -> f (g b) -> f (g a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap ((a -> b) -> g b -> g a forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a contramap a -> b f )f (g b) fga )instanceContravariant Proxy wherecontramap :: (a -> b) -> Proxy b -> Proxy a contramap a -> b _Proxy b _=Proxy a forall k (t :: k). Proxy t Proxy newtypePredicate a =Predicate {Predicate a -> a -> Bool getPredicate ::a ->Bool}-- | A 'Predicate' is a 'Contravariant' 'Functor', because 'contramap' can-- apply its function argument to the input of the predicate.instanceContravariant Predicate wherecontramap :: (a -> b) -> Predicate b -> Predicate a contramap a -> b f Predicate b g =(a -> Bool) -> Predicate a forall a. (a -> Bool) -> Predicate a Predicate ((a -> Bool) -> Predicate a) -> (a -> Bool) -> Predicate a forall a b. (a -> b) -> a -> b $ Predicate b -> b -> Bool forall a. Predicate a -> a -> Bool getPredicate Predicate b g (b -> Bool) -> (a -> b) -> a -> Bool forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . a -> b f instanceSemigroup (Predicate a )wherePredicate a -> Bool p <> :: Predicate a -> Predicate a -> Predicate a <> Predicate a -> Bool q =(a -> Bool) -> Predicate a forall a. (a -> Bool) -> Predicate a Predicate ((a -> Bool) -> Predicate a) -> (a -> Bool) -> Predicate a forall a b. (a -> b) -> a -> b $ \a a ->a -> Bool p a a Bool -> Bool -> Bool &&a -> Bool q a a instanceMonoid (Predicate a )wheremempty :: Predicate a mempty =(a -> Bool) -> Predicate a forall a. (a -> Bool) -> Predicate a Predicate ((a -> Bool) -> Predicate a) -> (a -> Bool) -> Predicate a forall a b. (a -> b) -> a -> b $ Bool -> a -> Bool forall a b. a -> b -> a const Bool True-- | Defines a total ordering on a type as per 'compare'.---- This condition is not checked by the types. You must ensure that the-- supplied values are valid total orderings yourself.newtypeComparison a =Comparison {Comparison a -> a -> a -> Ordering getComparison ::a ->a ->Ordering}derivinginstanceSemigroup (Comparison a )derivinginstanceMonoid (Comparison a )-- | A 'Comparison' is a 'Contravariant' 'Functor', because 'contramap' can-- apply its function argument to each input of the comparison function.instanceContravariant Comparison wherecontramap :: (a -> b) -> Comparison b -> Comparison a contramap a -> b f Comparison b g =(a -> a -> Ordering) -> Comparison a forall a. (a -> a -> Ordering) -> Comparison a Comparison ((a -> a -> Ordering) -> Comparison a) -> (a -> a -> Ordering) -> Comparison a forall a b. (a -> b) -> a -> b $ (b -> b -> Ordering) -> (a -> b) -> a -> a -> Ordering forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c on (Comparison b -> b -> b -> Ordering forall a. Comparison a -> a -> a -> Ordering getComparison Comparison b g )a -> b f -- | Compare using 'compare'.defaultComparison ::Orda =>Comparison a defaultComparison :: Comparison a defaultComparison =(a -> a -> Ordering) -> Comparison a forall a. (a -> a -> Ordering) -> Comparison a Comparison a -> a -> Ordering forall a. Ord a => a -> a -> Ordering compare-- | This data type represents an equivalence relation.---- Equivalence relations are expected to satisfy three laws:---- [Reflexivity]: @'getEquivalence' f a a = True@-- [Symmetry]: @'getEquivalence' f a b = 'getEquivalence' f b a@-- [Transitivity]:-- If @'getEquivalence' f a b@ and @'getEquivalence' f b c@ are both 'True'-- then so is @'getEquivalence' f a c@.---- The types alone do not enforce these laws, so you'll have to check them-- yourself.newtypeEquivalence a =Equivalence {Equivalence a -> a -> a -> Bool getEquivalence ::a ->a ->Bool}-- | Equivalence relations are 'Contravariant', because you can-- apply the contramapped function to each input to the equivalence-- relation.instanceContravariant Equivalence wherecontramap :: (a -> b) -> Equivalence b -> Equivalence a contramap a -> b f Equivalence b g =(a -> a -> Bool) -> Equivalence a forall a. (a -> a -> Bool) -> Equivalence a Equivalence ((a -> a -> Bool) -> Equivalence a) -> (a -> a -> Bool) -> Equivalence a forall a b. (a -> b) -> a -> b $ (b -> b -> Bool) -> (a -> b) -> a -> a -> Bool forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c on (Equivalence b -> b -> b -> Bool forall a. Equivalence a -> a -> a -> Bool getEquivalence Equivalence b g )a -> b f instanceSemigroup (Equivalence a )whereEquivalence a -> a -> Bool p <> :: Equivalence a -> Equivalence a -> Equivalence a <> Equivalence a -> a -> Bool q =(a -> a -> Bool) -> Equivalence a forall a. (a -> a -> Bool) -> Equivalence a Equivalence ((a -> a -> Bool) -> Equivalence a) -> (a -> a -> Bool) -> Equivalence a forall a b. (a -> b) -> a -> b $ \a a a b ->a -> a -> Bool p a a a b Bool -> Bool -> Bool &&a -> a -> Bool q a a a b instanceMonoid (Equivalence a )wheremempty :: Equivalence a mempty =(a -> a -> Bool) -> Equivalence a forall a. (a -> a -> Bool) -> Equivalence a Equivalence (\a _a _->Bool True)-- | Check for equivalence with '=='.---- Note: The instances for 'Double' and 'Float' violate reflexivity for @NaN@.defaultEquivalence ::Eqa =>Equivalence a defaultEquivalence :: Equivalence a defaultEquivalence =(a -> a -> Bool) -> Equivalence a forall a. (a -> a -> Bool) -> Equivalence a Equivalence a -> a -> Bool forall a. Eq a => a -> a -> Bool (==)comparisonEquivalence ::Comparison a ->Equivalence a comparisonEquivalence :: Comparison a -> Equivalence a comparisonEquivalence (Comparison a -> a -> Ordering p )=(a -> a -> Bool) -> Equivalence a forall a. (a -> a -> Bool) -> Equivalence a Equivalence ((a -> a -> Bool) -> Equivalence a) -> (a -> a -> Bool) -> Equivalence a forall a b. (a -> b) -> a -> b $ \a a a b ->a -> a -> Ordering p a a a b Ordering -> Ordering -> Bool forall a. Eq a => a -> a -> Bool ==Ordering EQ-- | Dual function arrows.newtypeOp a b =Op {Op a b -> b -> a getOp ::b ->a }derivinginstanceSemigroup a =>Semigroup (Op a b )derivinginstanceMonoid a =>Monoid (Op a b )instanceCategory Op whereid :: Op a a id =(a -> a) -> Op a a forall a b. (b -> a) -> Op a b Op a -> a forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a id Op c -> b f . :: Op b c -> Op a b -> Op a c . Op b -> a g =(c -> a) -> Op a c forall a b. (b -> a) -> Op a b Op (b -> a g (b -> a) -> (c -> b) -> c -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . c -> b f )instanceContravariant (Op a )wherecontramap :: (a -> b) -> Op a b -> Op a a contramap a -> b f Op a b g =(a -> a) -> Op a a forall a b. (b -> a) -> Op a b Op (Op a b -> b -> a forall a b. Op a b -> b -> a getOp Op a b g (b -> a) -> (a -> b) -> a -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . a -> b f )instanceNum a =>Num (Op a b )whereOp b -> a f + :: Op a b -> Op a b -> Op a b + Op b -> a g =(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ \b a ->b -> a f b a a -> a -> a forall a. Num a => a -> a -> a + b -> a g b a Op b -> a f * :: Op a b -> Op a b -> Op a b * Op b -> a g =(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ \b a ->b -> a f b a a -> a -> a forall a. Num a => a -> a -> a * b -> a g b a Op b -> a f - :: Op a b -> Op a b -> Op a b - Op b -> a g =(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ \b a ->b -> a f b a a -> a -> a forall a. Num a => a -> a -> a - b -> a g b a abs :: Op a b -> Op a b abs (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Num a => a -> a abs (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f signum :: Op a b -> Op a b signum (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Num a => a -> a signum (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f fromInteger :: Integer -> Op a b fromInteger =(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (Integer -> b -> a) -> Integer -> Op a b forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . a -> b -> a forall a b. a -> b -> a const (a -> b -> a) -> (Integer -> a) -> Integer -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . Integer -> a forall a. Num a => Integer -> a fromInteger instanceFractional a =>Fractional (Op a b )whereOp b -> a f / :: Op a b -> Op a b -> Op a b / Op b -> a g =(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ \b a ->b -> a f b a a -> a -> a forall a. Fractional a => a -> a -> a / b -> a g b a recip :: Op a b -> Op a b recip (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Fractional a => a -> a recip (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f fromRational :: Rational -> Op a b fromRational =(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (Rational -> b -> a) -> Rational -> Op a b forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . a -> b -> a forall a b. a -> b -> a const (a -> b -> a) -> (Rational -> a) -> Rational -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . Rational -> a forall a. Fractional a => Rational -> a fromRational instanceFloating a =>Floating (Op a b )wherepi :: Op a b pi =(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> b -> a forall a b. a -> b -> a const a forall a. Floating a => a pi exp :: Op a b -> Op a b exp (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a exp (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f sqrt :: Op a b -> Op a b sqrt (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a sqrt (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f log :: Op a b -> Op a b log (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a log (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f sin :: Op a b -> Op a b sin (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a sin (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f tan :: Op a b -> Op a b tan (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a tan (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f cos :: Op a b -> Op a b cos (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a cos (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f asin :: Op a b -> Op a b asin (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a asin (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f atan :: Op a b -> Op a b atan (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a atan (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f acos :: Op a b -> Op a b acos (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a acos (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f sinh :: Op a b -> Op a b sinh (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a sinh (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f tanh :: Op a b -> Op a b tanh (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a tanh (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f cosh :: Op a b -> Op a b cosh (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a cosh (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f asinh :: Op a b -> Op a b asinh (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a asinh (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f atanh :: Op a b -> Op a b atanh (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a atanh (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f acosh :: Op a b -> Op a b acosh (Op b -> a f )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ a -> a forall a. Floating a => a -> a acosh (a -> a) -> (b -> a) -> b -> a forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . b -> a f Op b -> a f ** :: Op a b -> Op a b -> Op a b ** Op b -> a g =(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ \b a ->b -> a f b a a -> a -> a forall a. Floating a => a -> a -> a ** b -> a g b a logBase :: Op a b -> Op a b -> Op a b logBase (Op b -> a f )(Op b -> a g )=(b -> a) -> Op a b forall a b. (b -> a) -> Op a b Op ((b -> a) -> Op a b) -> (b -> a) -> Op a b forall a b. (a -> b) -> a -> b $ \b a ->a -> a -> a forall a. Floating a => a -> a -> a logBase (b -> a f b a )(b -> a g b a )