Katamorfizm

podajemy serię przykładów, a następnie bardziej globalne podejście do katamorfizmu, w języku programowania Haskell.

Iteracjaedit

iteracja-krok po kroku prowadzi do liczb naturalnych jako obiektu początkowego.

rozważ funktorfmaybe mapowanie typu danychb do typu danychfmaybe b, który zawiera kopię każdego terminu zb, a także jeden dodatkowy terminNothing (w Haskell tak działaMaybe). Można to zakodować za pomocą jednego terminu i jednej funkcji. Niech więc instancja StepAlgebra zawiera również funkcję z fmaybe b do b, która mapuje Nothing do ustalonego terminu nil z b I gdzie akcje na skopiowanych warunkach będą wywoływane next.

lista foldEdit

dla stałego typua, rozważ odwzorowanie typów funkcyjnychb na typ produktu tych dwóch typów. Ponadto dodajemy również wyrażenie Nil do tego typu wynikowego. Algebra f mapuje teraz Nil do jakiegoś specjalnego terminu nil z b lub „Scala” parę (dowolny inny termin skonstruowanego typu) W termin b. To połączenie pary może być zakodowane jako funkcja typu a -> b -> b.

Tree foldEdit

dla stałego typu a, rozważ odwzorowanie typów functora b na typ, który zawiera kopię każdego wyrażenia a, a także wszystkie pary b’s (Warunki typu produktu dwóch wystąpień typu b). Algebra składa się z funkcji b, która działa na a lub dwóch b. To połączenie pary może być zakodowane jako dwie funkcje typu a -> b lub. b -> b -> b.

ogólny przypadek

głębsze badania teoretyczne algebr początkowych ujawniają, że F-algebra uzyskana z zastosowania funktora do własnej algebry początkowej jest dla niej izomorficzna.

Systemy typu Strong pozwalają nam abstrakcyjnie określić początkową algebrę funktora f jako jego stały punkt A = f a. Rekurencyjnie zdefiniowane katamorfizmy mogą być teraz kodowane w jednej linii, gdzie analiza przypadku (jak w różnych przykładach powyżej) jest zamknięta przez fmap. Ponieważ domeną tych ostatnich są obiekty w obrazie f, ocena katamorfizmów przeskakuje tam i z powrotem pomiędzy a I f a.

teraz znowu pierwszy przykład, ale teraz poprzez przekazanie funkcji Maybe Do Naprawy. Wielokrotne zastosowanie funkcji Maybe generuje łańcuch typów, który jednak może być zjednoczony izomorfizmem z twierdzenia o punkcie stałym. Wprowadzamy termin zero, który powstaje z Nothing I identyfikujemy funkcję następcy z wielokrotnym zastosowaniem Just. W ten sposób powstają liczby naturalne.

i znowu przykład drzewa. W tym celu musimy podać typ danych tree container, abyśmy mogli ustawićfmap (nie musieliśmy tego robić dlaMaybe functor, ponieważ jest to część standardowego preludium).

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

następujące wartości zostaną obliczone na 4:cata treeDepth $ meet (end "X") (meet (meet (end "YXX") (end "YXY")) (end "YY"))

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.