damos uma série de exemplos, e então uma abordagem mais global aos catamorfismos, na Linguagem de programação Haskell.IterationEdit Iterationedit
Iteration-step prescriptions lead to natural numbers as initial object.
Considerar o functor fmaybe
mapeamento de um tipo de dados b
para um tipo de dados fmaybe b
, que contém uma cópia de cada termo, a partir de b
assim como um termo adicional Nothing
(em Haskell, isso é o que Maybe
faz). Isto pode ser codificado usando um termo e uma função. Então vamos a uma instância de um StepAlgebra também inclui uma função de fmaybe b
b
, que mapeia Nothing
a um prazo fixo nil
de b
e onde as ações no copiados termos será chamado de next
.
Lista de foldEdit
Para um tipo fixo a
, considere o functor tipos de mapeamento b
para o tipo de produto desses dois tipos. Nós também adicionamos um termo Nil
a este tipo resultante. Um f-álgebra-se agora, map Nil
a alguns prazo nil
de b
ou “mala” um par (de qualquer outro termo construídas tipo) em um prazo de b
. Esta junção de um par pode ser codificada como uma função do tipo a -> b -> b
.
Árvore foldEdit
Para um tipo fixo a
considere o functor tipos de mapeamento b
para um tipo que contém uma cópia de cada período de a
assim como todos os pares de b
‘s (em termos do tipo de produto de duas instâncias do tipo b
). Uma álgebra consiste de uma função b
, que atua em um a
termo ou dois b
termos. Esta junção de um par pode ser codificada como duas funções do tipo a -> b
resp. b -> b -> b
.
geral caseEdit
estudos teóricos de categoria mais profunda das álgebras iniciais revelam que a álgebra F obtida da aplicação do functor à sua própria álgebra inicial é isomórfica para ela.
Strong type systems enable us to abstractly specify the initial algebra of a functor f
as its fixed point A = f A. Os catamorfismos definidos recursivamente podem agora ser codificados em uma única linha, onde a análise de caso (como nos diferentes exemplos acima) é encapsulada pelo fmap. Uma vez que o domínio destes últimos são os objetos na imagem de f
, a avaliação do catamorphisms salta para trás e para a frente entre a
e f a
.
Agora novamente o primeiro exemplo, mas agora através da passagem do functor talvez para corrigir. A aplicação repetida do talvez functor gera uma cadeia de tipos, que, no entanto, podem ser unidos pelo isomorfismo a partir do teorema do ponto fixo. Nós introduzimos o termo zero
, que surge a partir de Maybes do Nothing
e identificar um sucessor função com aplicação repetida de Just
. Desta forma os números naturais surgem.
E agora novamente o exemplo da árvore. Para isso, devemos fornecer o container da árvore de tipo de dados para que possamos configurar o fmap
(nós não temos de o fazer para o Maybe
functor, como é parte do padrão prelúdio).
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
O seguinte irá avaliar como 4: cata treeDepth $ meet (end "X") (meet (meet (end "YXX") (end "YXY")) (end "YY"))