[Haskell-cafe] Generalizing catMaybes

Roman Cheplyaka roma at ro-che.info
Sat Jan 8 11:03:35 CET 2011

* Tony Morris <tonymorris at gmail.com> [2011-01-08 12:56:28+1000]
>  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.

More information about the Haskell-Cafe mailing list