uvádíme řadu příkladů a pak globálnější přístup ke katamorfismům v programovacím jazyce Haskell.
IterationEdit
iterace-step prescripts vedou k přirozeným číslům jako počátečnímu objektu.
Zvážit funktor fmaybe
mapování typ dat b
na datový typ fmaybe b
, který obsahuje kopii každého termínu od b
stejně jako jeden další termín, Nothing
(v jazyce Haskell, to je to, co Maybe
). To lze kódovat pomocí jednoho termínu a jedné funkce. Tak ať instance StepAlgebra také patří funkce z fmaybe b
b
, který mapuje Nothing
na dobu určitou nil
b
, a kde je akce na kopírovat podmínek se bude jmenovat next
.
Seznam foldEdit
Pro fixní typ a
, zvažte funktor mapování typy b
typ produktu, který z těch dvou typů. K tomuto výslednému typu navíc přidáme výraz Nil
. F-algebry jsou nyní mapy Nil
nějaký zvláštní výraz, nil
b
nebo „sloučit“ pár (jakýkoliv jiný termín konstruovány typ), v období b
. Toto sloučení páru může být kódováno jako funkce typu a -> b -> b
.
Strom foldEdit
Pro fixní typ a
, zvažte funktor mapování typy b
na typ, který obsahuje kopii každého termínu a
stejně jako všechny dvojice b
‚s (jde o typ produktu, který ze dvou instancí typu b
). Algebra se skládá z funkce, aby b
, který buď působí na a
termín nebo dva b
podmínek. Toto sloučení páru může být kódováno jako dvě funkce typu a -> b
resp. b -> b -> b
.
Obecné caseEdit
Hlouběji kategorie teoretických studiích počáteční algebry ukazují, že F-algebry získané použitím funktor jeho vlastní počáteční algebra je izomorfní.
systémy silného typu nám umožňují abstraktně specifikovat počáteční algebru funktoru f
jako jeho pevný bod a = f a. Rekurzivně definované katamorfismy lze nyní kódovat v jednom řádku, kde je případová analýza (jako v různých příkladech výše) zapouzdřena fmap. Od domény druhé jsou objekty v obraze f
, hodnocení catamorphisms skáče tam a zpět mezi a
f a
.
nyní opět první příklad, ale nyní prostřednictvím předání možná funktoru opravit. Opakovaná aplikace funktoru generuje řetězec typů, který však může být spojen izomorfismem z věty s pevným bodem. Jsme zavést tento termín, zero
, který vzniká z „Možná“ Nothing
a určit nástupce s funkcí opakovaného používání Just
. Tímto způsobem vznikají přirozená čísla.
a nyní opět příklad stromu. K tomu musíme poskytnout strom kontejner typ dat tak, že můžeme nastavit fmap
(neměli jsme to dělat, Maybe
funktor, protože to je součástí standardní předehrou).
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
následující zhodnotí na 4: cata treeDepth $ meet (end "X") (meet (meet (end "YXX") (end "YXY")) (end "YY"))