Catamorphism

vi ger en serie exempel, och sedan en mer global strategi för katamorfismer, i programmeringsspråket Haskell.

IterationEdit

Iterationsstegsrecept leder till naturliga tal som initialt objekt.

Tänk på funktorn fmaybe kartlägga en datatyp b till en datatyp fmaybe b, som innehåller en kopia av varje term från b samt en ytterligare term Nothing (I Haskell är detta vad Maybe gör). Detta kan kodas med en term och en funktion. Så låt en instans av en StepAlgebra också inkludera en funktion från fmaybe b till b, som kartlägger Nothing till en fast term nil av b, och där åtgärderna på de kopierade termerna kommer att kallas next.

List foldEdit

för en fast typ a, överväga functor mapping typer b till produkttypen för dessa två typer. Vi lägger dessutom till en term Nil till denna resulterande typ. En f-algebra ska nu kartlägga Nil till någon speciell term nil av b eller” slå samman”ett par (någon annan term av den konstruerade typen) till en term av b. Denna sammanslagning av ett par kan kodas som en funktion av typen a -> b -> b.

träd foldEdit

för en fast typ a, överväga functor mapping typer b till en typ som innehåller en kopia av varje term av a samt alla par av b’s (termer av produkttypen för två instanser av typen b). En algebra består av en funktion till b, som antingen verkar på en a term eller två b termer. Denna sammanslagning av ett par kan kodas som två funktioner av typen a -> b resp. b -> b -> b.

allmänt falledit

djupare kategori teoretiska studier av initiala algebror avslöjar att F-algebra erhållen genom att applicera funktorn på sin egen initiala algebra är isomorf för den.

starka typsystem gör det möjligt för oss att Abstrakt specificera den initiala algebraen för en funktor f som dess fasta punkt a = f A. De rekursivt definierade katamorfismerna kan nu kodas i en enda rad, där fallanalysen (som i de olika exemplen ovan) inkapslas av fmap. Eftersom domänen för den senare är objekt i bilden av f, hoppar utvärderingen av katamorfismerna fram och tillbaka mellan a och f a.

nu igen det första exemplet, men nu via passerar kanske functor att fixa. Upprepad tillämpning av Maybe functor genererar en kedja av typer, som emellertid kan förenas av isomorfismen från fastpunktssatsen. Vi introducerar termen zero, som härrör från Maybes Nothing och identifierar en efterföljande funktion med upprepad tillämpning av Just. På så sätt uppstår de naturliga siffrorna.

och nu igen trädexemplet. För detta måste vi tillhandahålla trädbehållardatatypen så att vi kan ställa in fmap (vi behövde inte göra det för Maybe functor, eftersom det är en del av standardförspelet).

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

Följande kommer att utvärdera till 4: cata treeDepth $ meet (end "X") (meet (meet (end "YXX") (end "YXY")) (end "YY"))

Lämna ett svar

Din e-postadress kommer inte publiceras.