
* 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!
For example, import Control.Applicative import Data.Foldable as F import Control.Monad.Writer cat' :: (Applicative list, Foldable list, Monoid (list a), Foldable maybe) => list (maybe a) -> list a cat' = fold . fmap (execWriter . F.mapM_ (\x -> tell (pure x))) However, this looks rather useless -- there are probably not many containers which can be substituted instead of 'list'. I think catMaybes deserves its own typeclass, which would represent "truncatable" structures: class Truncatable struct where catMaybes :: struct (Maybe a) -> Maybe a This would make perfect sense for Set, Map etc. -- Roman I. Cheplyaka :: http://ro-che.info/ Don't worry what people think, they don't do it very often.