Sunteți pe pagina 1din 33

Programare declarativa

Teoria categoriilor pentru programatori1

, a
Traian Florin S, erbanut
FMI, UNIBUC
Departamentul de Informatica,
traian.serbanuta@fmi.unibuc.ro

27 noiembrie 2015

bazata pe cartea Category Theory for Programmers de Bartosz Milewski

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

1 / 26

Category Theory for the Working C++ Programmer


de Bartosz Milewski

http://www.youtube.com/watch?v=eCUfzvz7Z20

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

2 / 26

Categorii

Categorii

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

3 / 26

Categorii

Categorii
O categorie C este data de:
O clasa |C| a obiectelor
, ilor / morfismelor
O clasa C a saget
saget
, i domeniul
Doua funct, ii dom, cod : C |C| care asociaza fiecarei
s, i codomeniul ei. Pentru orice obiecte A s, i B,

C(A , B ) = {f C | dom(f ) = A , cod (f ) = B }


, ilor de la A la B.
este mult, imea saget
f C(A , B ) poate fi scris ca f : A B

Pentru orice obiect A o sageat


a id A : A > A numita identitatea lui A
, ilor
Pentru orice obiecte A , B, C, o operat, ie de compunere a saget
: C(B , C ) C(A , B ) C(A , C )
Compunerea este asociativa s, i are element neutru id
,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

4 / 26

Categorii

Exemplu: Categoria Set

Obiecte: mult, imi


, i: funct, ii
Saget
, i: Funct, iile identitate
Identitat
Compunere: Compunerea funct, iilor
atoare

Categorii aseman
lui Set
Categoria grupurilor cu morfisme de grupuri
Categoria algebrelor de o signatura data

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

5 / 26

Categorii

Exemplu: Categoria Hask

Obiectele: tipuri
, iile: funct, ii ntre tipuri
Saget
f : : A > B

, i: funct, ia polimorfica id
Identitat
Prelude > : t i d
i d : : a > a

Compunere: funct, ia polimorfica (.)


Prelude > : t ( . )
( . ) : : ( b > c ) > ( a > b ) > a > c

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

6 / 26

Categorii

atoare

Categorii neaseman
lui Set
Categoria unui graf (V , E )

Obiecte:
, i:
Saget
, i:
Identitat
Compunere:

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

7 / 26

Categorii

atoare

Categorii neaseman
lui Set
Categoria unui graf (V , E )

Obiecte: varfurile grafului V


, i: drumuri n grafuri
Saget
, i: drumul vid de la un vrf la el nsus, i
Identitat
Compunere: alipirea drumurilor

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

7 / 26

Categorii

atoare

Categorii neaseman
lui Set
Categoria unei relat, ii part, iale de ordine (S , )

Obiecte:
, i:
Saget
, i:
Identitat
Compunere:

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

8 / 26

Categorii

atoare

Categorii neaseman
lui Set
Categoria unei relat, ii part, iale de ordine (S , )

Obiecte: elementele lui S


, i: perechile (a , b ) din
Saget
, i: garantate de reflexivitate
Identitat
Compunere: garantata de tranzitivitate

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

8 / 26

Categorii

atoare

Categorii neaseman
lui Set
Categoria asociata unui monoid (M , , e )

Obiecte:
, i:
Saget
, i:
Identitat
Compunere:

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

9 / 26

Categorii

atoare

Categorii neaseman
lui Set
Categoria asociata unui monoid (M , , e )

numim m
Obiecte: un singur obiect, sa-l
, i: Elementele lui M
Saget
, i: e
Identitat
Compunere:

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

9 / 26

Categorii

atoare

Categorii neaseman
lui Set
Categoria asociata unui monoid (M , , e )

numim m
Obiecte: un singur obiect, sa-l
, i: Elementele lui M
Saget
, i: e
Identitat
Compunere:
De fapt, merge s, i invers. . .
Monoidul asociat unei categorii cu un singur obiect |C| = {m}
M = C = C(m, m)

=
e = id m

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

9 / 26

Categorii

De ce categorii?

(Des)compunerea este esent, a programarii


Am de rezolvat problema P
O descompun n subproblemele P1 ,. . . Pn
Rezolv problemele P1 ,. . . Pn cu programele p1 ,. . . pn
Eventual aplicnd recursiv procedura de fat, a

Compun rezolvarile
p1 ,. . . pn ntr-o rezolvare p pentru problema init, iala
Categoriile rezolva problema compunerii
datele
Ne fort, eaza sa abstractizam
, i (metode?)
Se poate act, iona asupra datelor doar prin saget
Fort, eaza un stil de compunere independent de structura obiectelor

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

10 / 26

Monoizi

Monoizi

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

11 / 26

Monoizi

Monoizi
Data.Monoid.Monoid

class Monoid m where


mempty : : m
mappend : : m > m > m

Monoidul listelor
instance Monoid [ a ] where
mempty = [ ]
mappend = ( + + )

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

12 / 26

Monoizi

Monoide booleene
Monoidul conjunctiv

Data.Monoid.All

newtype A l l = A l l { g e t A l l : : Bool }
instance Monoid A l l where
mempty = A l l True
A l l x mappend A l l y = A l l ( x && y )

Monoidul disjunctiv

Data.Monoid.Any

newtype Any = Any { getAny : : Bool }


instance Monoid Any where
mempty = Any False
Any x mappend Any y = Any ( x | | y )

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

13 / 26

Monoizi

Monoide numerice
Monoidul aditiv

Data.Monoid.Sum

newtype Sum a = Sum { getSum : : a }


instance Num a => Monoid (Sum a ) where
mempty = Sum 0
Sum x mappend Sum y = Sum ( x + y )

Monoidul multiplicativ

Data.Monoid.Product

newtype Product a = Product { g e t P r o d u c t : : a }


instance Num a => Monoid ( Product a ) where
mempty = Product 1
Product x mappend Product y = Product ( x * y )

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

14 / 26

Monoizi

La ce sunt buni Monoizii?


Data.Foldable.foldMap

Agregare ntr-un monoid:


foldMap : : Monoid m => ( a > m) > [ a ] > m
foldMap f = f o l d r ( mappend . f ) mempty

Exemple
concat : : [ [ a ] ] > [ a ]
concat = foldMap i d
a l l : : [ Bool ] > Bool
a l l = g e t A l l . foldMap A l l

any : : [ Bool ] > Bool


any = getAny . foldMap Any

sum : : Num a => [ a ] > a


sum = getSum . foldMap Sum

product : : Num a => [ a ] > a


product =
g e t P r o d u c t . foldMap Product

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

15 / 26

Monoizi

Monoidul endomorfismelor

newtype Endo a = Endo { appEndo : : a > a }


instance Monoid ( Endo a ) where
mempty = Endo i d
Endo f mappend Endo g = Endo ( f . g )

Mult, imea funct, iilor din A n A are structura de monoid

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

16 / 26

Monoizi

Relat, ia ntre foldr s, i foldMap

foldMap n funct, ie de foldr


foldMap : : Monoid m => ( a > m) > [ a ] > m
foldMap f = f o l d r ( mappend . f ) mempty

foldr n funct, ie de foldMap


f o l d r : : ( a > b > b ) > b > [ a ] > b
f o l d r f z t = appEndo ( foldMap ( Endo . f ) t ) z

Observat, ie: f :: a > (b > b) translateaza un element din a ntr-un


endomorfism peste b

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

17 / 26

Obiecte speciale ntr-o categorie

Obiecte speciale ntr-o categorie

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

18 / 26

Obiecte speciale ntr-o categorie

Obiecte init, iale s, i finale


Obiect init, ial

Un obiect din care exista un singur morfism catre


orice alt obiect
mult, imea vida n categoria Set
Algebra de termeni peste o signatura
Obiect final

Un obiect catre
care exista un singur morfism din orice alt obiect
O mult, ime singleton n categoria Set

Algebra n care suportul fiecarui


sort e singleton
Tipul () n Hask
Pentru orice tip a, exista o singura funct, ie de la a n ()
u n i t : : a > ( )
unit _ = ()
,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

19 / 26

Dualitate

Dualitate

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

20 / 26

Dualitate

Duala unei categorii


Data fiind categoria C, putem defini duala ei Cop , prin simpla inversare a
, ilor, astfel:
direct, iiei saget

|Cop | = |C|

Cop = C

domCop = codomC

codomCop = domC

Cop : C (B , C ) C (A , B ) C (A , C ) data de:


pentru f Cop (B , C ) = C(C , B ) s, i g Cop (A , B ) = C(B , A ), definim
op

op

op

f Cop g = g C f C(C , A ) = Cop (A , C )


, ile ramn

Identitat
aceleas, i
, ile de asociativitate
Se verifica proprietat
Orice proprietate poate fi dualizata
Obiect final este obiect init, ial n categoria duala
Obiect init, ial este obiect final n categoria duala
,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

21 / 26

Izomorfism

Izomorfism

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

22 / 26

Izomorfism

Izomorfism. Obiecte izomorfe


Un morfism f :: A > B se numes, te izomorfism daca exista un morfism
g :: B > A astfel nct
f . g = i d : : B > B
g . f = i d : : A > A
n acest caz, s, i g este izomorfism, iare obiectele A s, i B se numesc izomorfe
Obiectul init, ial e unic (modulo izomorfisme)
Teorema:

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

23 / 26

Izomorfism

Izomorfism. Obiecte izomorfe


Un morfism f :: A > B se numes, te izomorfism daca exista un morfism
g :: B > A astfel nct
f . g = i d : : B > B
g . f = i d : : A > A
n acest caz, s, i g este izomorfism, iare obiectele A s, i B se numesc izomorfe
Obiectul init, ial e unic (modulo izomorfisme)
Teorema:
oricare doua obiecte init, iale ntr-o categorie sunt izomorfe
Adica,
Fie A s, i B init, iale. Atunci exista (unice) f :: A > B s, i g :: B > A. Avem:
f . g : : B > B
i d : : B > B
g . f : : A > A
i d : : A > A
Din unicitatea morfismelor de la A n A s, i B n B, rezulta
f . g = i d : : B > B
g . f = i d : : A > A
Din dualitate s, i obiectul final e unic (modulo izomorfime)
,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

23 / 26

Produse s, i coproduse

Produse s, i coproduse

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

24 / 26

Produse s, i coproduse

Produs
Produsul a doua obiecte a s, i b este obiectul c nzestrat cu doua proiect, ii
pa :: c > a s, i pb :: c > b astfel nct pentru orice alt obiect c nzestrat
cu doua proiect, ii pa :: c > a s, i pb :: c > b, exista un unic morfism

m :: c > c care factorizeaza aceste proiect, ii, adica:

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

25 / 26

Produse s, i coproduse

Produs
Produsul a doua obiecte a s, i b este obiectul c nzestrat cu doua proiect, ii
pa :: c > a s, i pb :: c > b astfel nct pentru orice alt obiect c nzestrat
cu doua proiect, ii pa :: c > a s, i pb :: c > b, exista un unic morfism

m :: c > c care factorizeaza aceste proiect, ii, adica:


m . pa = pa

m . pb = pb

type Product a b = ( a , b )
pa : : Product a b > a
pa = f s t
pb : : Product a b > b
pb = snd

F a c t o r i z a r e a
factor
: : ( c > a ) > ( c > b ) > ( c > Product a b )
f a c t o r pa pb x = ( pa x , pb x )
Avem
f s t . f a c t o r pa pb = pa
,a (UNIBUC)
Traian Florin S, erbanut

snd . f a c t o r pa pb = pb
PDIntrare/Ies, ire

27 noiembrie 2015

25 / 26

Produse s, i coproduse

Coproduse
adica
Coprodusul a doua obiecte a s, i b este produsul lor n categoria duala,

obiectul c nzestrat cu doua inject, ii ia :: a > ca s, i ib :: b > c astfel


nct pentru orice alt obiect c nzestrat cu doua inject, ii ia :: a > c s, i
ib :: b > c, exista un unic morfism m :: c > c care factorizeaza
aceste inject, ii, adica ia . m = ia s, i ib . m = ib

,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

26 / 26

Produse s, i coproduse

Coproduse
adica
Coprodusul a doua obiecte a s, i b este produsul lor n categoria duala,

obiectul c nzestrat cu doua inject, ii ia :: a > ca s, i ib :: b > c astfel


nct pentru orice alt obiect c nzestrat cu doua inject, ii ia :: a > c s, i
ib :: b > c, exista un unic morfism m :: c > c care factorizeaza
aceste inject, ii, adica ia . m = ia s, i ib . m = ib
type Sum a b = L e f t a | Right b
i a : : a > Sum a b
ia = Left
i b : : b > Sum a b
i b = Right

F a c t o r i z a r e a
factor
: : ( a > c ) > ( b > c ) > (Sum a b > c )
f a c t o r ia ib ( Left x ) = ia x
f a c t o r i a i b ( Right x ) = i b x
Avem
f a c t o r ia ib . i a = ia
f a c t o r ia ib . i b = ib
,a (UNIBUC)
Traian Florin S, erbanut

PDIntrare/Ies, ire

27 noiembrie 2015

26 / 26