
On Mon, Mar 05, 2007 at 10:12:44PM -0600, Bryan Burgers wrote:
Haskellers,
Recently, I have come across a couple of situations in which I need to "pull a monad out of a functor" so to speak. The first time it was needed, I didn't think much of it, but the second time started me thinking whether there is already an existing construct for this. The type signatures I have in mind are:
pull :: (Monad m, Functor f) => f (m a) -> m (f a) fmapM :: (Monad m, Functor f) => (a -> m b) -> f a -> m (f b) fmapM f = pull . fmap f
You may notice that these are already defined for the List functor as 'sequence' and 'mapM'. It seems to me that if this were a class, the implementor would be defining a traversing order by defining pull; in the list case this traversing sequence is clearly defined as head to tail.
I am wondering if there is already a construct for this that I am not aware of (a class, a way to defined it using monads and functors that I am not aware of, an idiom)? Is this something that frequently happens for others, or is it a sign a few of my designs have been flawed recently?
http://haskell.org/ghc/dist/current/docs/libraries/base/Data-Traversable.htm... pull is sequence, fmapM is mapM (also see the sequenceA, traverse functions for the more general case of applicative functors vs. monads) Stefan