-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Fixpoint data types -- -- Fixpoint types and recursion schemes. If you define your AST as -- fixpoint type, you get fold and unfold operations for free. -- -- Thanks for contribution to: Matej Kollar, Herbert Valerio Riedel @package data-fix @version 0.2.0 -- | Fix-point type. It allows to define generic recursion schemes. -- --
--   Fix f = f (Fix f)
--   
-- -- Type f should be a Functor if you want to use simple -- recursion schemes or Traversable if you want to use monadic -- recursion schemes. This style allows you to express recursive -- functions in non-recursive manner. You can imagine that a -- non-recursive function holds values of the previous iteration. -- -- Little example: -- --
--   type List a = Fix (L a)
--   
--   data L a b = Nil | Cons a b
--   
--   instance Functor (L a) where
--      fmap f x = case x of
--          Nil      -> Nil
--          Cons a b -> Cons a (f b)
--   
--   length :: List a -> Int
--   length = cata $ \x -> case x of
--      Nil      -> 0
--      Cons _ n -> n + 1
--   
--   sum :: Num a => List a -> a
--   sum = cata $ \x -> case x of
--      Nil      -> 0
--      Cons a s -> a + s
--   
module Data.Fix -- | A fix-point type. newtype Fix f Fix :: f (Fix f) -> Fix f [unFix] :: Fix f -> f (Fix f) -- | Catamorphism or generic function fold. cata :: Functor f => (f a -> a) -> (Fix f -> a) -- | Anamorphism or generic function unfold. ana :: Functor f => (a -> f a) -> (a -> Fix f) -- | Hylomorphism is anamorphism followed by catamorphism. hylo :: Functor f => (f b -> b) -> (a -> f a) -> (a -> b) -- | Infix version of hylo. (~>) :: Functor f => (a -> f a) -> (f b -> b) -> (a -> b) -- | Monadic catamorphism. cataM :: (Applicative m, Monad m, Traversable t) => (t a -> m a) -> Fix t -> m a -- | Monadic anamorphism. anaM :: (Applicative m, Monad m, Traversable t) => (a -> m (t a)) -> (a -> m (Fix t)) -- | Monadic hylomorphism. hyloM :: (Applicative m, Monad m, Traversable t) => (t b -> m b) -> (a -> m (t a)) -> (a -> m b) instance GHC.Generics.Generic (Data.Fix.Fix f) instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Data.Fix.Fix f))) => Data.Data.Data (Data.Fix.Fix f) instance GHC.Show.Show (f (Data.Fix.Fix f)) => GHC.Show.Show (Data.Fix.Fix f) instance GHC.Read.Read (f (Data.Fix.Fix f)) => GHC.Read.Read (Data.Fix.Fix f) instance GHC.Classes.Eq (f (Data.Fix.Fix f)) => GHC.Classes.Eq (Data.Fix.Fix f) instance GHC.Classes.Ord (f (Data.Fix.Fix f)) => GHC.Classes.Ord (Data.Fix.Fix f)