0 | module Control.Category.Closed
2 | import Control.Category.Core
3 | import Control.Category.Functor
4 | import Control.Category.Monoidal
5 | import Control.Category.Cartesian
6 | import Data.Morphisms
29 | interface Monoidal cat ten i =>
30 | Closed (0 cat : Hom obj) (ten,hom : obj -> obj -> obj) (i : obj) | cat,ten where
31 | constructor MkClosed
33 | curry : {a,b,c : _} -> cat (a `ten` b) c -> cat a (b `hom` c)
35 | uncurry : {a,b,c : _} -> cat a (b `hom` c) -> cat (a `ten` b) c
43 | CartesianClosed : (cat : Hom obj) -> (ten,hom : obj -> obj -> obj) -> (i : obj) -> Type
44 | CartesianClosed cat ten hom i = (Cartesian cat ten i, Closed cat ten hom i)
53 | eval : Closed cat ten hom i => {a,b : _} -> cat ((a `hom` b) `ten` a) b
54 | eval @{c@(MkClosed{})} = uncurry id
58 | coeval : Closed cat ten hom i => {a,b : _} -> cat a (b `hom` (a `ten` b))
59 | coeval @{c@(MkClosed{})} = curry {ten} id
67 | Closed Morphism Pair Morphism () where
68 | curry (Mor f) = Mor $
Mor . curry f
69 | uncurry (Mor f) = Mor $
uncurry $
applyMor . f
72 | Closed Morphism Pair (~~>) () where
73 | curry = Mor . curry . applyMor
74 | uncurry = Mor . uncurry . applyMor
78 | [Function] Closed (~~>) Pair (~~>) ()
79 | using Monoidal.FuncPair where
80 | curry = Prelude.curry
81 | uncurry = Prelude.uncurry