
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? Bryan

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

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
Ah yes, thank you! Saying "It seems to me that if this were a class, the implementor would be defining a traversing order by defining pull" should have tipped me off to check out the 'Traversable' class before asking (but, having probably only seen that class once or twice before in passing, it was probably too deep in my head for quick retrieval). Bryan
participants (2)
-
Bryan Burgers
-
Stefan O'Rear