packages feed

gasp-1.4.0.0: Algebra/CategoryRecords.hs

{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE EmptyCase #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ConstrainedClassMethods #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE StandaloneKindSignatures #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE PolyKinds #-}

module Algebra.CategoryRecords where


data CategoryRec con cat = CategoryRec{
  (∘)      :: forall a b c. (con a, con b, con c) => b `cat` c -> a `cat` b -> a `cat` c
  ,id :: forall a. con a => a `cat` a
  }
   
data MonoidalRec x i con cat = MonoidalRec
  {(⊗) :: forall a b c d. (con a, con b, con c, con d) => (a `cat` b) -> (c `cat` d) -> (a `x` c) `cat` (b `x` d)
  ,assoc     :: forall a b c. (con a, con b, con c) => ((a `x` b) `x` c) `cat` (a `x` (b `x` c))
  ,assoc_    :: forall a b c. (con a, con b, con c) => (a `x` (b `x` c)) `cat` ((a `x` b) `x` c)
  ,unitorR   :: forall a. (con a,con i) => a `cat` (a `x` i)
  ,unitorR_  :: forall a. (con a,con i) => (a `x` i) `cat` a
  ,unitorL   :: forall a. (con a, con i) => a `cat` (i `x` a)
  ,unitorL_  :: forall a. (con a, con i) => (i `x` a) `cat` a
  }

data BraidedRec x i con cat = BraidedRec
  {swap, swap_ :: forall a b. (con a, con b) => (a `x` b) `cat` (b `x` a)
  }

data CartesianRec x i con cat = CartesianRec
  {exl   ::   forall a b. (con a, con b)                     =>    (a `x` b) `cat` a
  ,exr   ::   forall a b. (con a, con b)                     =>    (a `x` b) `cat` b
  ,dis   ::   forall a.  con a                       =>    a `cat` i
  ,dup   ::   forall a. con a                        =>    a `cat` (a `x` a)
  ,(▵)   ::   forall a b c. (con a,con b, con c) =>    (a `cat` b) -> (a `cat` c) -> a `cat` (b `x` c)
  
  }