{-# LANGUAGE PolyKinds #-} {-# LANGUAGE StandaloneKindSignatures #-} module Control.Category.Dual where import Prelude hiding (id, (.)) import Control.Category import Data.Kind (Type) type Dual :: forall k. (k -> k -> Type) -> k -> k -> Type newtype Dual cat a b = Dual { forall k (cat :: k -> k -> *) (a :: k) (b :: k). Dual cat a b -> cat b a getDual :: cat b a } instance Category cat => Category (Dual cat) where id :: forall (a :: k). Dual cat a a id = cat a a -> Dual cat a a forall k (cat :: k -> k -> *) (a :: k) (b :: k). cat b a -> Dual cat a b Dual cat a a forall (a :: k). cat a a forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a id Dual cat c b cb . :: forall (b :: k) (c :: k) (a :: k). Dual cat b c -> Dual cat a b -> Dual cat a c . Dual cat b a ba = cat c a -> Dual cat a c forall k (cat :: k -> k -> *) (a :: k) (b :: k). cat b a -> Dual cat a b Dual (cat b a ba cat b a -> cat c b -> cat c a forall (b :: k) (c :: k) (a :: k). cat b c -> cat a b -> cat a c forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . cat c b cb)