Seminár 2: Funktory a Prirodzené Transformácie Funktor F : C D • Zobrazenie z kategórie C do kategórie D. • Skladá sa z 1. Objektového zobrazenia : O c —> Od a —> Fa 2. Zobrazenia morŕizniov : a, b G Oc, C (a, b) —> D(Fa, Fb) f^Ff • Zachováva štruktúru : 1. F(ida) = idFa 2. F (g o /) = Fg o F f Špeciálne funktory Vlastnosti definované na základe oboch zobrazení. • Injektívny - objektové zobrazenie je injektívne • Surjektívny - objektové zobrazenie je surjektívne • Faithful - každé zobrazemie morŕizniov je injektívne • Full - každé zobrazemie morŕizmov je surjektívne • Endofunktor - funktor do rovnakej kategórie, napr. F : C —> C Zároveň hovoríme, že ak morŕizmus Ff alebo objekt Fa má nejakú vlastnost implikuje, že morŕizmus f alebo objekt a mal danú vlastnost, tak funktor reflektuje (Reflects) danú vlastnost. Môžeme zachovávat napríklad terminalitu / inicialitu objektov alebo epi / mono pre morfizmy. Veta : Faithful funktor reflektuje epi/ mono pre morfizmy. Príklady funktorov • Identický ide ■ C —>• C o e Oc ■ idc(o) = o f G Hom(a, b) : ídc(f) = f • Konštantný : C —>• D, d e D oeOc ■ Adc(o) = d f e Hom(a, b) : Ad(f) = ídd Prirodzené transformácie • pre kategórie C, D a funktory F, G : C —> D definujeme prirodzenú transformáciu /i = {/ia G D(Fa, Ga)\a G Oc} • na sa nazýva komponenta prirodzenej transformácie /i v a • Transformácia musí splňovat Naturality condition, podmienku prirodzenosti, /ib o F f = G f o jj,ai ktorú zadáva Naturality square : 1 Fa -F f-y Fb • Prirodzená transformácia medzi G, F nemusí existovat, napríklad ak medzi Fa a Ga neexistuje žiaden morŕizmus. Zároveň ich môže existovat viacero, kedže medzi Fa a Ga môže existovat viacero morŕizmov. • Vzhladom na to, že prirodzené transformácie sú znova morŕizmy môžeme zadeŕinovat kategóriu, v ktorej funktory C —> D budú objekty a prirodzené transformácie budú morŕizmy Príklady z Haskellu • Funktory sa v Haskelli vyskytujú napríklad ako typové konštruktory, ktoré sú doplnené ešte o funkciu, transformujúcu morŕizmy týchto typov. Takto sa dá zadeŕinovat napríklad Maybe : Data Maybe a = Nothing | Just a fmapMaybe (&—>&)—> (Maybe a —> Maybe b) fmapMaybe f Nothing = Nothing fmapMaybe f (Just x) = Just (f x) • V haskelli je tiež možné aj abstrahovat našu ideu funktoru za použitia typvej triedy typových konštruktorov. class Functor f where f map ::(a—> b) —> f a —> f b potom teda môžeme zadeŕinovat naše Maybe ako inštanciu Funktoru instance Functor Maybe where f map f Nothing = Nothing f map f (Just x) = Just (f x) alebo môžeme zadeŕinovat napríklad List data List a = Nil | Cons a (List a) instance Functor List where f map f Nil = Nil f map f (Cons h t) = Cons (f h) (f map ft)) • Nakoniec príklad prirodzenej transformácie z List a do Maybe a safeHead :: [a] —> Maybe a safeHead [] = Nothing safeHead (x : xs) = Just x 2