
In article <20040528001157.GA1924@momenergy.repetae.net>,
John Meacham
class FunctorM f where fmapM :: Monad m => (a -> m b) -> f a -> m (f b)
I have an equivalent (I think) class in HBase in its big library of Functor classes: class (Functor f) => ExtractableFunctor f where { fextract :: forall g a. (FunctorApplyReturn g) => f (g a) -> g (f a); }; for :: (ExtractableFunctor f,FunctorApplyReturn m) => (a -> m b) -> (f a -> m (f b)); for foo fa = fextract (fmap foo fa); The important thing here is that a FunctorApplyReturn is more general than Monad, it has only return and "fapply :: f (a -> b) -> f a -> f b". Given this, it's also possible to write this function (by using a state monad): ftolist :: (ExtractableFunctor f) => f a -> [a] The main Functor classes in HBase are arranged like this: Functor <= FunctorApply <= FunctorApplyReturn <= Monad Doubtless if I knew a little more category theory, I'd have better names for them. It would be nice if the standard libraries adopted a superclass arrangement like this... -- Ashley Yakeley, Seattle WA