* Tony Morris <[email protected]> [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.
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe