Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
- class Category' p where
- class (Category' p, Bifunctor p, Dom p ~ Op p, p ~ Op (Dom p), Cod p ~ Nat p (->), Dom2 p ~ p, Cod2 p ~ (->)) => Category'' p
- class (Category'' p, Category'' (Op p), p ~ Op (Op p), Ob p ~ Ob (Op p)) => Category p
- class (Category' (Dom f), Category' (Cod f)) => Functor f where
- class (Functor f, Dom f ~ p, Cod f ~ q) => FunctorOf p q f
- ob :: forall f a. Functor f => Ob (Dom f) a :- Ob (Cod f) (f a)
- obOf :: (Category (Dom f), Category (Cod f)) => NatId f -> Endo (Dom f) a -> Dict (Ob (Nat (Dom f) (Cod f)) f, Ob (Dom f) a, Ob (Cod f) (f a))
- contramap :: Functor f => Opd f b a -> Cod f (f a) (f b)
- class (Functor p, Cod p ~ Nat (Dom2 p) (Cod2 p), Category' (Dom2 p), Category' (Cod2 p)) => Bifunctor p
- type Cod2 p = NatCod (Cod p)
- type Dom2 p = NatDom (Cod p)
- fmap1 :: forall p a b c. (Bifunctor p, Ob (Dom p) c) => Dom2 p a b -> Cod2 p (p c a) (p c b)
- first :: (Functor f, Cod f ~ Nat d e, Ob d c) => Dom f a b -> e (f a c) (f b c)
- bimap :: Bifunctor p => Dom p a b -> Dom2 p c d -> Cod2 p (p a c) (p b d)
- dimap :: Bifunctor p => Opd p b a -> Dom2 p c d -> Cod2 p (p a c) (p b d)
- class Vacuous c a
- data Constraint :: BOX
- newtype a :- b :: Constraint -> Constraint -> * = Sub (a -> Dict b)
- data Dict $a :: Constraint -> * where
- (\\) :: a => (b -> r) -> (:-) a b -> r
- sub :: (a => Proxy a -> Dict b) -> a :- b
- class Class b h | h -> b where
- class b :=> h | h -> b where
- newtype Yoneda p a b = Op {
- getOp :: p b a
- type family Op p :: i -> i -> *
- type Opd f = Op (Dom f)
- data Nat p q f g where
- type NatId p = Endo (Nat (Dom p) (Cod p)) p
- type Endo p a = p a a
- nat :: (Category p, Category q, FunctorOf p q f, FunctorOf p q g) => (forall a. Ob p a => Endo p a -> q (f a) (g a)) -> Nat p q f g
- (!) :: Nat p q f g -> p a a -> q (f a) (g a)
- type Presheaves p = Nat (Op p) (->)
- type Copresheaves p = Nat p (->)
- type family NatDom f :: i -> i -> *
- type family NatCod f :: j -> j -> *
- ($) :: (a -> b) -> a -> b
- data Either a b :: * -> * -> *
- newtype Fix f a = In {}
Category
class Category' p where Source
Side-conditions moved to Functor
to work around GHC bug #9200.
You should produce instances of Category'
and consume instances of Category
.
All of our categories are "locally small", and we curry the Hom-functor as a functor to the category of copresheaves rather than present it as a bifunctor directly. The benefit of this encoding is that a bifunctor is just a functor to a functor category!
C :: C^op -> [ C, Set ]
type Ob p :: i -> Constraint Source
observe :: p a b -> Dict (Ob p a, Ob p b) Source
(.) :: p b c -> p a b -> p a c Source
Category' * (->) | |
Category' Constraint (:-) | |
(Category k p, (~) (k -> k -> *) (Op k p) (Yoneda k p)) => Category' k (Yoneda k p) | |
Category' k (Unit k k) | |
(Category' k p, Category' k1 q) => Category' (k -> k) (Nat k k p q) | |
(Category k p, Category k1 q) => Category' (Either k k) (Coproduct k k p q) | |
(Category k p, Category k1 q) => Category' ((,) k k) (Product k k p q) |
class (Category' p, Bifunctor p, Dom p ~ Op p, p ~ Op (Dom p), Cod p ~ Nat p (->), Dom2 p ~ p, Cod2 p ~ (->)) => Category'' p Source
class (Category'' p, Category'' (Op p), p ~ Op (Op p), Ob p ~ Ob (Op p)) => Category p Source
The full definition for a (locally-small) category.
(Category'' k p, Category'' k (Op k p), (~) (k -> k -> *) p (Op k (Op k p)), (~) (k -> Constraint) (Ob k p) (Ob k (Op k p))) => Category k p |
Functors
Regular
class (Category' (Dom f), Category' (Cod f)) => Functor f where Source
Functor Constraint * Dict | |
Functor * * ((->) a) | |
Functor * * (Either a) | |
Functor * * ((,) a) | |
FunctorOf * (* -> *) (->) (Nat * * (->) (->)) p => Functor * * (Fix p) | |
Functor Constraint * ((:-) b) | |
(Category' k c, (~) (k -> Constraint) (Ob k c) (Vacuous k c)) => Functor k Constraint (Vacuous k c) | |
Identified k c => Functor k k (Id k c) | |
(Category k p, (~) (k -> k -> *) (Op k p) (Yoneda k p)) => Functor k * (Yoneda k p a) | |
Functor k * (Unit k k a) | |
(Category k c, Ob k c r, Ob k c a) => Functor k * (Beget k c r a) | |
(Category k c, Ob k c r, Ob k c a) => Functor k * (Get k c r a) | |
((~) (k -> k -> *) (Dom k (k -> k) t) c, CopresheafOf k c f, CopresheafOf k c g) => Functor k * (Day k t f g) | |
(Category k c, Category k2 d, Composed k1 e, Functor k2 k1 f, Functor k k2 g, (~) (k1 -> k1 -> *) e (Cod k2 k1 f), (~) (k2 -> k2 -> *) d (Cod k k2 g), (~) (k2 -> k2 -> *) d (Dom k2 k1 f), (~) (k -> k -> *) c (Dom k k2 g)) => Functor k k (Compose k k k c d e f g) | |
(Category k1 c, Category k2 d, Category k e, ProfunctorOf k k2 d e p, ProfunctorOf k2 k1 c d q, Ob k1 c a) => Functor k * (Procompose k k k c d e p q a) | |
Functor * (* -> *) (->) | |
Functor * (* -> *) Either | |
Functor * (* -> *) (,) | |
Functor Constraint (Constraint -> *) (:-) | |
(Category k p, (~) (k -> k -> *) (Op k p) (Yoneda k p)) => Functor k (k -> *) (Yoneda k p) | |
Category k c => Functor k (k -> k -> *) (Beget k c) | |
Category k c => Functor k (k -> k -> *) (Get k c) | |
Functor k (k -> *) (Unit k k) | |
(Category k c, Ob k c r) => Functor k (k -> *) (Beget k c r) | |
(Category k c, Ob k c r) => Functor k (k -> *) (Get k c r) | |
(Category k c, Category k1 d, Category k2 e, ProfunctorOf k2 k1 d e p, ProfunctorOf k1 k c d q) => Functor k (k -> *) (Procompose k k k c d e p q) | |
(Category' k p, Category' k1 q) => Functor (k -> k) Constraint (FunctorOf k k p q) | |
(Category' k p, Category k1 q) => Functor (k -> k) * (Nat k k p q a) | |
(Category k p, Category k1 q) => Functor (Either k k) * (Coproduct k k p q a) | |
(Category k p, Category k1 q, ProductOb k k1 p q a) => Functor ((,) k k) * (Product k k p q a) | |
Functor (* -> * -> *) (* -> *) Fix | |
((~) (k -> k -> *) (Dom k (k -> k) t) c, Category k c) => Functor (k -> *) ((k -> *) -> k -> *) (Day k t) | |
((~) (k -> k -> *) (Dom k (k -> k) t) c, CopresheafOf k c f) => Functor (k -> *) (k -> *) (Day k t f) | |
(Category' k p, Category k1 q) => Functor (k -> k) ((k -> k) -> *) (Nat k k p q) | |
(Category k p, Category k1 q) => Functor (Either k k) (Either k k -> *) (Coproduct k k p q) | |
(Category k p, Category k1 q) => Functor ((,) k k) ((,) k k -> *) (Product k k p q) | |
(Category k c, Category k1 d, Category k2 e) => Functor (k -> k -> *) ((k -> k -> *) -> k -> k -> *) (Procompose k k k c d e) | |
(Category k c, Category k1 d, Composed k2 e) => Functor (k -> k) ((k -> k) -> k -> k) (Compose k k k c d e) | |
(Category k c, Category k1 d, Category k2 e, ProfunctorOf k2 k1 d e p) => Functor (k -> k -> *) (k -> k -> *) (Procompose k k k c d e p) | |
(Category k c, Category k1 d, Composed k2 e, Functor k1 k2 f, (~) (k2 -> k2 -> *) e (Cod k1 k2 f), (~) (k1 -> k1 -> *) d (Dom k1 k2 f)) => Functor (k -> k) (k -> k) (Compose k k k c d e f) |
class (Functor f, Dom f ~ p, Cod f ~ q) => FunctorOf p q f Source
(Functor k k1 f, (~) (k -> k -> *) (Dom k k1 f) p, (~) (k1 -> k1 -> *) (Cod k k1 f) q) => FunctorOf k k p q f | |
(Category' k p, Category' k1 q) => Functor (k -> k) Constraint (FunctorOf k k p q) | |
type Dom (k -> k1) Constraint (FunctorOf k k1 p q) = Nat k k1 p q | |
type Cod (k -> k1) Constraint (FunctorOf k k1 p q) = (:-) |
obOf :: (Category (Dom f), Category (Cod f)) => NatId f -> Endo (Dom f) a -> Dict (Ob (Nat (Dom f) (Cod f)) f, Ob (Dom f) a, Ob (Cod f) (f a)) Source
(Curried) Bifunctors
class (Functor p, Cod p ~ Nat (Dom2 p) (Cod2 p), Category' (Dom2 p), Category' (Cod2 p)) => Bifunctor p Source
dimap :: Bifunctor p => Opd p b a -> Dom2 p c d -> Cod2 p (p a c) (p b d) Source
E-Enriched profunctors f : C -/-> D are represented by a functor of the form:
C^op -> [ D, E ]
The variance here matches Haskell's order, which means that the contravariant argument comes first!
Vacuous
Vacuous k c a | |
(Category' k c, (~) (k -> Constraint) (Ob k c) (Vacuous k c)) => Functor k Constraint (Vacuous k c) | |
type Dom k Constraint (Vacuous k c) = c | |
type Cod k Constraint (Vacuous k c) = (:-) |
Categories
Constraints
data Constraint :: BOX
newtype a :- b :: Constraint -> Constraint -> * infixr 9
Category Constraint (:-) | |
Category' Constraint (:-) | |
Identified Constraint (:-) | |
Composed Constraint (:-) | |
Functor Constraint * ((:-) b) | |
() :=> (Eq ((:-) a b)) | |
() :=> (Ord ((:-) a b)) | |
() :=> (Show ((:-) a b)) | |
Functor Constraint (Constraint -> *) (:-) | |
FullyFaithful Constraint (Constraint -> *) (:-) | |
Eq ((:-) a b) | |
(Typeable Constraint p, Typeable Constraint q, p, q) => Data ((:-) p q) | |
Ord ((:-) a b) | |
Show ((:-) a b) | |
Typeable (Constraint -> Constraint -> *) (:-) | |
type Ob Constraint (:-) = Vacuous Constraint (:-) | |
type Dom Constraint * ((:-) a) = (:-) | |
type Cod Constraint * ((:-) a) = (->) | |
type Dom Constraint (Constraint -> *) (:-) = Op Constraint (:-) | |
type Cod Constraint (Constraint -> *) (:-) = Nat Constraint * (:-) (->) |
data Dict $a :: Constraint -> * where
Capture a dictionary for a given constraint
Functor Constraint * Dict | |
FullyFaithful Constraint * Dict | |
a :=> (Read (Dict a)) | |
a :=> (Monoid (Dict a)) | |
a :=> (Enum (Dict a)) | |
a :=> (Bounded (Dict a)) | |
() :=> (Eq (Dict a)) | |
() :=> (Ord (Dict a)) | |
() :=> (Show (Dict a)) | |
a => Bounded (Dict a) | |
a => Enum (Dict a) | |
Eq (Dict a) | |
(Typeable Constraint p, p) => Data (Dict p) | |
Ord (Dict a) | |
a => Read (Dict a) | |
Show (Dict a) | |
a => Monoid (Dict a) | |
Typeable (Constraint -> *) Dict | |
type Dom Constraint * Dict = (:-) | |
type Cod Constraint * Dict = (->) |
(\\) :: a => (b -> r) -> (:-) a b -> r infixl 1
Given that a :- b
, derive something that needs a context b
, using the context a
class Class b h | h -> b where
Reify the relationship between a class and its superclass constraints as a class
Class () () | |
Class () (Bounded a) | |
Class () (Enum a) | |
Class () (Eq a) | |
Class () (Monad f) | |
Class () (Functor f) | |
Class () (Num a) | |
Class () (Read a) | |
Class () (Show a) | |
Class () (Monoid a) | |
Class () (Class b a) | |
Class () ((:=>) b a) | |
Class b a => () :=> (Class b a) | |
Category Constraint c => Class a (Id Constraint c a) | |
Class (Eq a) (Ord a) | |
Class (Fractional a) (Floating a) | |
Class (Monad f) (MonadPlus f) | |
Class (Functor f) (Applicative f) | |
Class (Num a) (Fractional a) | |
Class (Applicative f) (Alternative f) | |
(Category k c, Category k1 d, Category Constraint e) => Class (f (g a)) (Compose k k Constraint c d e f g a) | |
Class (Num a, Ord a) (Real a) | |
Class (Real a, Fractional a) (RealFrac a) | |
Class (Real a, Enum a) (Integral a) | |
Class (RealFrac a, Floating a) (RealFloat a) |
class b :=> h | h -> b where infixr 9
Reify the relationship between an instance head and its body as a class
Op
The Yoneda embedding.
Yoneda_C :: C -> [ C^op, Set ]
(Category k p, (~) (k -> k -> *) (Op k p) (Yoneda k p)) => Functor k * (Yoneda k p a) | |
(Category k p, (~) (k -> k -> *) (Op k p) (Yoneda k p)) => Category' k (Yoneda k p) | |
(Category k p, (~) (k -> k -> *) (Op k p) (Yoneda k p)) => Functor k (k -> *) (Yoneda k p) | |
type Dom k * (Yoneda k p a) = Yoneda k p | |
type Cod k * (Yoneda k p a) = (->) | |
type Ob k (Yoneda k p) = Ob k p | |
type Dom k (k -> *) (Yoneda k p) = p | |
type Cod k (k -> *) (Yoneda k p) = Nat k * (Yoneda k p) (->) |
Nat
(Category' k p, Category k1 q) => Functor (k -> k) * (Nat k k p q a) | |
(Category' k p, Category k1 q) => Functor (k -> k) ((k -> k) -> *) (Nat k k p q) | |
(Category' k p, Category' k1 q) => Category' (k -> k) (Nat k k p q) | |
(Category k c, Identified k1 d) => Identified (k -> k) (Nat k k c d) | |
(Category k c, Composed k1 d) => Composed (k -> k) (Nat k k c d) | |
type Dom (k -> k1) * (Nat k k1 p q f) = Nat k k1 p q | |
type Cod (k -> k1) * (Nat k k1 p q f) = (->) | |
type Dom (k -> k1) ((k -> k1) -> *) (Nat k k1 p q) = Op (k -> k1) (Nat k k1 p q) | |
type Cod (k -> k1) ((k -> k1) -> *) (Nat k k1 p q) = Nat (k -> k1) * (Nat k k1 p q) (->) | |
type Ob (k -> k1) (Nat k k1 p q) = FunctorOf k k1 p q |
nat :: (Category p, Category q, FunctorOf p q f, FunctorOf p q g) => (forall a. Ob p a => Endo p a -> q (f a) (g a)) -> Nat p q f g Source
type Presheaves p = Nat (Op p) (->) Source
type Copresheaves p = Nat p (->) Source
Prelude
($) :: (a -> b) -> a -> b infixr 0
Application operator. This operator is redundant, since ordinary
application (f x)
means the same as (f
. However, $
x)$
has
low, right-associative binding precedence, so it sometimes allows
parentheses to be omitted; for example:
f $ g $ h x = f (g (h x))
It is also useful in higher-order situations, such as
,
or map
($
0) xs
.zipWith
($
) fs xs
data Either a b :: * -> * -> *
The Either
type represents values with two possibilities: a value of
type
is either Either
a b
or Left
a
.Right
b
The Either
type is sometimes used to represent a value which is
either correct or an error; by convention, the Left
constructor is
used to hold an error value and the Right
constructor is used to
hold a correct value (mnemonic: "right" also means "correct").
Tensor' * Either | |
Semitensor * Either | |
Comonoid' * Either Void | |
Cosemigroup * Either Void | |
Monoid' * Either Void | |
Semigroup * Either Void | |
Functor * * (Either a) | |
() :=> (Monad (Either a)) | |
() :=> (Functor (Either a)) | |
() :=> (Applicative (Either a)) | |
Functor * (* -> *) Either | |
Monad (Either e) | |
Functor (Either a) | |
Applicative (Either e) | |
Generic1 (Either a) | |
(Eq a, Eq b) => Eq (Either a b) | |
(Ord a, Ord b) => Ord (Either a b) | |
(Read a, Read b) => Read (Either a b) | |
(Show a, Show b) => Show (Either a b) | |
Generic (Either a b) | |
Semigroup (Either a b) | |
Typeable (* -> * -> *) Either | |
(Category k p, Category k1 q) => Functor (Either k k) * (Coproduct k k p q a) | |
(Eq a, Eq b) :=> (Eq (Either a b)) | |
(Ord a, Ord b) :=> (Ord (Either a b)) | |
(Read a, Read b) :=> (Read (Either a b)) | |
(Show a, Show b) :=> (Show (Either a b)) | |
(Category k p, Category k1 q) => Functor (Either k k) (Either k k -> *) (Coproduct k k p q) | |
(Category k p, Category k1 q) => Category' (Either k k) (Coproduct k k p q) | |
type I * Either = Void | |
type Dom * * (Either a) = (->) | |
type Cod * * (Either a) = (->) | |
type Dom * (* -> *) Either = (->) | |
type Cod * (* -> *) Either = Nat * * (->) (->) | |
type Rep1 (Either a) = D1 D1Either ((:+:) (C1 C1_0Either (S1 NoSelector (Rec0 a))) (C1 C1_1Either (S1 NoSelector Par1))) | |
type Rep (Either a b) = D1 D1Either ((:+:) (C1 C1_0Either (S1 NoSelector (Rec0 a))) (C1 C1_1Either (S1 NoSelector (Rec0 b)))) | |
type (==) (Either k k1) a b = EqEither k k1 a b | |
type Dom (Either k k1) * (Coproduct k k1 p q a) = Coproduct k k1 p q | |
type Cod (Either k k1) * (Coproduct k k1 p q a) = (->) | |
type Dom (Either k k1) (Either k k1 -> *) (Coproduct k k1 p q) = Op (Either k k1) (Coproduct k k1 p q) | |
type Cod (Either k k1) (Either k k1 -> *) (Coproduct k k1 p q) = Nat (Either k k1) * (Coproduct k k1 p q) (->) | |
type Ob (Either k k1) (Coproduct k k1 p q) = CoproductOb k k1 p q |