Transformări naturale
În secțiunea anterioară am discutat despre functori dar mai important decăt funtori în teoria categoriilor sunt transformările naturale. Informal o transformare naturală este mapare între functori, print-o transformare naturală un functor este transformat în altul.
Definiție: Transformare naturală
Dându-se două categorii , și doi functori , , o transformare naturală este o colecție de morfisme care pentru , numită componenta lui în , astfel încât pentru oricare morfism următoarea diagramă comută:
Când ne referim că acestă diagramă comută ne referim la faptul că perechile de morfisme se compun pe diagonală în același morfism, astfel trebuie să fie satisfacută următoarea relație:
Posibila formalizare in Lean 4
class NaturalTransformation (F G : Functor (C: Category ObjC) D) where
app : (x : ObjC) -> D.Hom (F.mapObj x) (G.mapObj x)
naturality : ∀ {x y : ObjC} {f : C.Hom x y}, D.comp (app y) (F.mapHom f) = D.comp (G.mapHom f) (app x)
Compunere
Și în cazul transformărilor naturale acestea se pot compune ca morfismele și functorii doar că exista două tipuri de compuneri, verticale și orizontale, din moment ce putem compune transformările naturale în serie, respectiv paralel cu compunerea functorilor.
Având functorii , , și transformările naturale , atunci va exista mereu o transformare naturală care are componentele . Acesta este compunerea verticală a transormărilor naturale, sau compunere în serie.
Compunerea verticală, uneori numită produs Godement, este compunerea transformărilor naturale paralele. Fie categoriile și functorii și . Dacă există transformările naturale și atunci compunerea verticală este care satisface următoarea diagramă comutativă:
Ca formulă componentele trebuie să satisfacă condiția ca indiferent ce tranformare naturală aplicăm prima dată nu trebuie să conteze, trebuie să obșinem aceiași componentă a transnformării naturale compuse, .
Putem simplifica această formulă folosind whiskering, cănd avem de aplicat o transformare naturală inainte sau după compunerea unui functor este mai simplu de specifica acest lucru prin a scrie respectiv . Folosind whiskering condiția devine . În această formă este mult mai ușur de gestionat, altfel putem vedea toate diagramele comutative într-o formă grafică ca mai jos:
Motivul de ce le spunem compuneri verticale, respectiv orizontale, o să fie mai evident cănd vom vorbi de 2-categorii dar până atunci putem avea o intuiție când desenăm diagramele cu ambele compuneri:
Legătura cu programarea
În programare se folosesc des transformările naturale deși nu sunt știute sub acest nume. Cea mai uzuală transformare naturală folosită în programare este parametrizarea tipurilor generice care impune o transformare naturală de la functor identitate către aplicarea unui tip generic care implementează acesta functie. De exemplu, putem vedea cum se aplică acest lucru la clasa generică pentru liste în diagrama următoare:
Morfismele verticale care sunt componentele transformării naturale reprezintă aplicarea tipului generic peste tipurile inițiale iar funcția map/fmap/select din programare funcțională este cea care adaugă existența morfismelor orizontale astfel încât diagrama să comute.