Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
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
Synopsis
- newtype Fix f = Fix {}
- cata :: Functor f => (f a -> a) -> Fix f -> a
- ana :: Functor f => (a -> f a) -> a -> Fix f
- hylo :: Functor f => (f b -> b) -> (a -> f a) -> a -> b
- (~>) :: Functor f => (a -> f a) -> (f b -> b) -> a -> b
- cataM :: (Applicative m, Monad m, Traversable t) => (t a -> m a) -> Fix t -> m a
- anaM :: (Applicative m, Monad m, Traversable t) => (a -> m (t a)) -> a -> m (Fix t)
- hyloM :: (Applicative m, Monad m, Traversable t) => (t b -> m b) -> (a -> m (t a)) -> a -> m b
Documentation
A fix-point type.
Instances
Eq (f (Fix f)) => Eq (Fix f) Source # | |
(Typeable f, Data (f (Fix f))) => Data (Fix f) Source # | |
Defined in Data.Fix gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Fix f -> c (Fix f) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Fix f) # dataTypeOf :: Fix f -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Fix f)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Fix f)) # gmapT :: (forall b. Data b => b -> b) -> Fix f -> Fix f # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Fix f -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Fix f -> r # gmapQ :: (forall d. Data d => d -> u) -> Fix f -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Fix f -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Fix f -> m (Fix f) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Fix f -> m (Fix f) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Fix f -> m (Fix f) # | |
Ord (f (Fix f)) => Ord (Fix f) Source # | |
Read (f (Fix f)) => Read (Fix f) Source # | |
Show (f (Fix f)) => Show (Fix f) Source # | |
Generic (Fix f) Source # | |
type Rep (Fix f) Source # | |
Simple recursion
Type f
should be a Functor
. They transform
non-recursive functions to recursive ones.
hylo :: Functor f => (f b -> b) -> (a -> f a) -> a -> b Source #
Hylomorphism is anamorphism followed by catamorphism.
Monadic recursion
Type f
should be a Traversable
.
cataM :: (Applicative m, Monad m, Traversable t) => (t a -> m a) -> Fix t -> m a Source #
Monadic catamorphism.
anaM :: (Applicative m, Monad m, Traversable t) => (a -> m (t a)) -> a -> m (Fix t) Source #
Monadic anamorphism.
hyloM :: (Applicative m, Monad m, Traversable t) => (t b -> m b) -> (a -> m (t a)) -> a -> m b Source #
Monadic hylomorphism.