
On Fri, Jan 7, 2011 at 9:56 PM, Tony Morris
I am wondering if it possible to generalise catMaybes:
(Something f, SomethingElse t) => t (f a) -> t a
I have being doing some gymnastics with Traversable and Foldable and a couple of other things from category-extras to no avail. Perhaps someone else's brain is molded into an appropriate shape to reveal an answer!
This gets you part of the way there:
(>>= maybe mzero return) :: (MonadPlus m) => m (Maybe a) -> m a
I'm not sure what the SomethingElse should look like. One possibility
would be Foldable.
(>>= Data.Foldable.foldr (mplus . return) mzero)
:: (MonadPlus m, Foldable t) => m (t a) -> m a
I have a MonadPlus-to-Monoid wrapper I call MSum, so I could also write it,
(>>= getMSum . foldMap (MSum . return))
:: (MonadPlus m, Foldable t) => m (t a) -> m a
--
Dave Menendez