Catamorphism

Diamo una serie di esempi, e quindi un approccio più globale ai catamorfismi, nel linguaggio di programmazione Haskell.

IterationEdit

Iteration-step prescrizioni portano a numeri naturali come oggetto iniziale.

si Consideri il funtore fmaybe mapping di un tipo di dati b per un tipo di dati fmaybe b, che contiene una copia di ogni termine di un b nonché un ulteriore termine Nothing (in Haskell, questo è ciò che Maybe fa). Questo può essere codificato usando un termine e una funzione. Quindi cerchiamo di un’istanza di un StepAlgebra includono anche una funzione fmaybe bb, che mappe Nothing per un termine fisso nil di b e in cui le azioni del copiato termini sarà chiamato next.

List foldEdit

Per un tipo fissoa, considerare i tipi di mappatura dei funtorib per il tipo di prodotto di questi due tipi. Inoltre aggiungiamo anche un termine Nil a questo tipo risultante. Una f-algebra deve ora mappare Nil a qualche termine speciale nil di b o “unire” una coppia (qualsiasi altro termine del tipo costruito) in un termine di b. Questa fusione di una coppia può essere codificata in funzione del tipo a -> b -> b.

Albero foldEdit

Per un determinato tipo a considerare il funtore tipi di mappatura b per un tipo che contiene una copia di ogni termine di a così come tutte le coppie di b‘s (in termini di tipo di prodotto di due istanze del tipo b). Un’algebra consiste in una funzione dib, che agisce su una termine o dueb termini. Questa fusione di una coppia può essere codificata come due funzioni di tipo a -> b resp. b -> b -> b.

Caso generaleedit

Categoria più profonda gli studi teorici delle algebre iniziali rivelano che l’F-algebra ottenuta applicando il funtore alla propria algebra iniziale è isomorfa ad essa.

I sistemi di tipo forte ci consentono di specificare astrattamente l’algebra iniziale di un funtoref come punto fisso a = f a. I catamorfismi ricorsivamente definiti possono ora essere codificati in una singola riga, dove l’analisi del caso (come nei diversi esempi sopra) è incapsulata dalla fmap. Poiché il dominio di questi ultimi sono oggetti nell’immagine di f, la valutazione dei catamorfismi salta avanti e indietro tra a e f a.

Ora di nuovo il primo esempio, ma ora passando il Forse functor per risolvere. L’applicazione ripetuta del funtore Maybe genera una catena di tipi, che, tuttavia, possono essere uniti dall’isomorfismo dal teorema del punto fisso. Introduciamo il termine zero, che deriva dal Nothingdi Maybes e identifichiamo una funzione successiva con l’applicazione ripetuta del Just. In questo modo sorgono i numeri naturali.

E ora di nuovo l’esempio dell’albero. Per questo dobbiamo fornire il tipo di dati del contenitore ad albero in modo da poter impostare il fmap (non abbiamo dovuto farlo per il Maybe, poiché fa parte del preludio 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

I seguenti valuterà a 4: cata treeDepth $ meet (end "X") (meet (meet (end "YXX") (end "YXY")) (end "YY"))

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.