module Control.Functor.Extras where
type Dist f g = forall a. f (g a) -> g (f a)
type Natural f g = forall a. f a -> g a
class PostFold m f where
postFold :: f (m (f a)) -> m (f a)
class PostUnfold w f where
postUnfold :: w (f a) -> f (w (f a))
class PreFold f m where
preFold :: f (m (f a)) -> f (m a)
class PreUnfold f w where
preUnfold :: f (w a) -> f (w (f a))
class Distributes f g where
dist :: f (g a) -> g (f a)
class Functor f => FunctorZero f where
fzero :: f a
class FunctorZero f => FunctorPlus f where
fplus :: f a -> f a -> f a
class Functor f => FunctorSplit f where
fsplit :: f a -> (f a, f a)