Katamorfismus

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 bb, který mapuje Nothing na dobu určitou nilb, 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, nilb 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 af 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"))

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.