0 | module Data.Functor.Algebra
24 | interface Algebra (f : Type -> Type) (0 carrier : Type)where
25 | constructor MkAlgebra
26 | reduce : f carrier -> carrier
34 | Num a => Algebra List a where
35 | reduce = foldr (+) (fromInteger 0)
40 | {n : Nat} -> Num a => Algebra (Vect n) a where
41 | reduce = foldr (+) (fromInteger 0)
49 | Num a => Algebra BinTreeLeaf a where
50 | reduce (Leaf leaf) = leaf
51 | reduce (Node _ leftTree rightTree)
52 | = (reduce {f=BinTreeLeaf} leftTree) +
53 | (reduce {f=BinTreeLeaf} rightTree)
61 | Num a => Algebra BinTreeNode a where
62 | reduce (Leaf _) = fromInteger 0
63 | reduce (Node node leftTree rightTree)
64 | = node + (reduce {f=BinTreeNode} leftTree)
65 | + (reduce {f=BinTreeNode} rightTree)
73 | Num a => Algebra BinTreeSame a where
74 | reduce (Leaf leaf) = leaf
75 | reduce (Node node leftTree rightTree)
76 | = node + (reduce {f=BinTreeSame} leftTree)
77 | + (reduce {f=BinTreeSame} rightTree)
89 | [usualSumLeaf] Num a => Applicative f => Algebra BinTreeLeaf (f a) where
90 | reduce (Leaf leaf) = leaf
91 | reduce (Node node leftTree rightTree)
92 | = let lt = reduce {f=BinTreeLeaf} leftTree
93 | rt = reduce {f=BinTreeLeaf} rightTree
94 | in (uncurry (+)) <$> (liftA2 lt rt)
97 | public export covering
98 | Num a => Algebra RoseTreeSame a where
100 | reduce (Node x subTrees)
101 | = x + reduce ((reduce {f=RoseTreeSame}) <$> subTrees)
117 | public export covering
118 | data Initial : (f : Type -> Type) -> Type where
120 | In : f (Initial f) -> Initial f
124 | Out : Initial f -> f (Initial f)
127 | public export covering
128 | cata : Functor f =>
129 | Algebra f a -> (Initial f -> a)
130 | cata (MkAlgebra g) rs = g $
cata (MkAlgebra g) <$> Out rs
134 | public export covering
135 | data Final : (f : Type -> Type) -> Type where
136 | MkFinal : f (Inf (Final f)) -> Final f
139 | public export covering
140 | embedFinal : Final f -> Inf (Final f)
143 | public export covering
145 | (a -> f a) -> a -> Final f
146 | ana next seed = MkFinal $
(embedFinal . ana next) <$> next seed