Safe Haskell | Safe-Infered |
---|

Scary named folds...

- para :: Functor f => (Mu f -> f a -> a) -> Mu f -> a
- para' :: Functor f => (f (Mu f, a) -> a) -> Mu f -> a
- paraList :: (Functor f, Foldable f) => (Mu f -> [a] -> a) -> Mu f -> a
- cata :: Functor f => (f a -> a) -> Mu f -> a
- ana :: Functor f => (a -> f a) -> a -> Mu f
- apo :: Functor f => (a -> f (Either (Mu f) a)) -> a -> Mu f
- hylo :: Functor f => (f a -> a) -> (b -> f b) -> b -> a
- zygo_ :: Functor f => (f b -> b) -> (f (b, a) -> a) -> Mu f -> a
- zygo :: Functor f => (f b -> b) -> (f (b, a) -> a) -> Mu f -> (b, a)
- newtype Free f a = Free {}
- newtype CoFree f a = CoFree {}
- futu :: Functor f => (a -> f (Free f a)) -> a -> Mu f
- histo :: Functor f => (f (CoFree f a) -> a) -> Mu f -> a
- paraM :: (Monad m, Traversable f) => (Mu f -> f a -> m a) -> Mu f -> m a
- paraM_ :: (Monad m, Traversable f) => (Mu f -> f a -> m a) -> Mu f -> m ()
- cataM :: (Monad m, Traversable f) => (f a -> m a) -> Mu f -> m a
- cataM_ :: (Monad m, Traversable f) => (f a -> m a) -> Mu f -> m ()

# Classic ana/cata/para/hylo-morphisms

para :: Functor f => (Mu f -> f a -> a) -> Mu f -> aSource

A *paramorphism* is a generalized (right) fold.

cata :: Functor f => (f a -> a) -> Mu f -> aSource

A *catamorphism* is a simpler version of a paramorphism

ana :: Functor f => (a -> f a) -> a -> Mu fSource

An *anamorphism* is simply an unfold. Probably not very useful in this context.

apo :: Functor f => (a -> f (Either (Mu f) a)) -> a -> Mu fSource

An *apomorphism* is a generalization of the anamorphism.

hylo :: Functor f => (f a -> a) -> (b -> f b) -> b -> aSource

A *hylomorphism* is the composition of a catamorphism and an anamorphism.

# More exotic stuff

zygo_ :: Functor f => (f b -> b) -> (f (b, a) -> a) -> Mu f -> aSource

A *zygomorphism* is a basically a catamorphism inside another catamorphism.
It could be implemented (somewhat wastefully) by first annotating each subtree
with the corresponding values of the inner catamorphism (`synthCata`

), then running
a paramorphims on the annotated tree:

zygo_ g h == para' u . synthCata g where u = h . fmap (first attribute) . unAnn first f (x,y) = (f x, y)

# Monadic versions

cataM :: (Monad m, Traversable f) => (f a -> m a) -> Mu f -> m aSource

Monadic catamorphism.