En morfi er en relasjon mellom objekter i en kategori
En profunktor mapper mellom ulike slike relasjoner:
- en global relasjon mellom objekter i kategorien
Eksempel: Hom-funktoren
class Profunctor p where
dimap :: (c -> a) -> (b -> d) -> p a b -> p c d
f :: a -> b
dimap f id (p b b) :: p a b
dimap id f (p a a) :: p a b
Eksempel
https://bartoszmilewski.com/2017/03/29/ends-and-coends/
https://bartoszmilewski.com/2017/03/29/ends-and-coends/
a
b
f
I
F
F a
F b
F f
c
C
a
b
f
C
P
P a a
P b b
x
P a b
P id f
P f id
X
{-# LANGUAGE RankNTypes #-}
import Data.Profunctor
-- for a given p, all diagonal elements p a a exist
type End p = forall a. p a a
-- given a profunctor p, an a and an End for p,
-- you can extract p a a
pi :: Profunctor p => forall a. (End p) -> p a a
pi e = e
-- Wedge condition
-- dimap f id . pi = dimap pi . f id
main :: IO ()
main = do
print $ Main.pi id 1
https://bartoszmilewski.com/2015/04/15/limits-and-colimits/
-- exists a. p a a
{-# LANGUAGE ExistentialQuantification #-}
data Coend p = forall a. Coend (p a a)
{-# LANGUAGE RankNTypes #-}
data End p = End (forall a. p a a)
In category theory, a coequalizer ... is a generalization of a quotient by an equivalence relation to objects in an arbitrary category. (Wikipedia)
refleksiv
symetrisk
transitiv
ekvivalens-klasse
kvote
Rasjonale tall er ekvivalensklasser for denne ekvivalensen
(exists x. p x x) -> c ≅ forall x. p x x -> c
Parametrisk polymorfi (produktet av alle funksjoner)
Funksjon som tar en sumtype som er summen av alle typer
data Procompose q p a b where
Procompose :: q a c -> p c b -> Procompose q p a b
exists c. (q a c, p c b)