dăm o serie de exemple și apoi o abordare mai globală a catamorfismelor, în limbajul de programare Haskell.
IterationEdit
retetele Iteration-step conduc la numere naturale ca obiect initial.
luați în considerare functorfmaybe
maparea unui tip de dateb
la un tip de datefmaybe b
, care conține o copie a fiecărui termen de lab
precum și un termen suplimentarNothing
(în Haskell, asta faceMaybe
). Acest lucru poate fi codificat folosind un termen și o funcție. Deci, să o instanță a unui StepAlgebra include, de asemenea, o funcție de la fmaybe b
la b
, care hărți Nothing
la un termen fix nil
de b
și unde acțiunile din Termenii copiați vor fi numite next
.
listați foldEdit
pentru un tip fixa
, luați în considerare tipurile de mapare functorb
la tipul de produs al acestor două tipuri. În plus, adăugăm și un termen Nil
la acest tip rezultat. O algebră f va mapa acum Nil
la un termen special nil
de b
sau” îmbina”o pereche (orice alt termen de tip construit) într-un termen de b
. Această îmbinare a unei perechi poate fi codificată în funcție de tipul a -> b -> b
.
arbore foldEdit
pentru un tip fix a
, luați în considerare tipurile de mapare functor b
la un tip care conține o copie a fiecărui termen de a
precum și toate perechile de b
‘s (Termenii tipului de produs a două instanțe ale tipului b
). O algebră constă dintr-o funcție b
, care fie acționează pe un a
termen sau doi b
Termeni. Această fuziune a unei perechi poate fi codificată ca două funcții de tip a -> b
resp. b -> b -> b
.
caz Generaledit
categoria mai profundă studiile teoretice ale algebrelor inițiale arată că F-algebra obținută din aplicarea functorului la propria algebră inițială este izomorfă pentru aceasta.
sistemele de tip puternic ne permit să specificăm abstract algebra inițială a unui functorf
ca punct fix a = f a. Catamorfismele definite recursiv pot fi acum codificate într-o singură linie, unde analiza cazului (ca în diferitele exemple de mai sus) este încapsulată de fmap. Deoarece domeniul acestora din urmă sunt obiecte din imaginea f
, evaluarea catamorfismelor sare înainte și înapoi între a
și f a
.
acum din nou primul exemplu, dar acum prin trecerea poate functor pentru a repara. Aplicarea repetată a poate functor generează un lanț de tipuri, care, totuși, poate fi unit de izomorfism din teorema punctului fix. Introducem termenul zero
, care apare din Nothing
al lui Maybes și identificăm o funcție succesoare cu aplicarea repetată a Just
. În acest fel apar numerele naturale.
și acum din nou exemplul copac. Pentru aceasta trebuie să furnizăm tipul de date al containerului arbore, astfel încât să putem configura fmap
(nu a trebuit să o facem pentru Maybe
functor, deoarece face parte din preludiul standard).
data Tcon a b = TconL a | TconR b binstance Functor (Tcon a) where fmap f (TconL x) = TconL x fmap f (TconR y z) = TconR (f y) (f z)
type Tree a = Fix (Tcon a) -- the initial algebraend :: a -> Tree aend = Iso . TconLmeet :: Tree a -> Tree a -> Tree ameet l r = Iso $ TconR l r
treeDepth :: Algebra (Tcon a) Integer -- again, the treeDepth f-algebra exampletreeDepth (TconL x) = 1treeDepth (TconR y z) = 1 + max y z
următoarele vor evalua la 4: cata treeDepth $ meet (end "X") (meet (meet (end "YXX") (end "YXY")) (end "YY"))