Catamorfismul

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"))

Lasă un răspuns

Adresa ta de email nu va fi publicată.