
Ah, yes, it's lovely how I can look at a function one day and then forget
it exists the very next. Carry on!
On Sat, Nov 8, 2014 at 2:22 PM, Edward Kmett
Um, msum / asum?
On Sat, Nov 8, 2014 at 2:06 PM, David Feuer
wrote: We've had First and Last in Data.Monoid for some time, and we now have Alt as well. Unfortunately, we don't have nice convenient functions for using them, the way we have sum and product to use Sum and Product. So we're stuck with funny-looking constructions like listToMaybe . mapMaybe f for lists, and nothing good for other containers.
My thought (the names firstAlt and lastAlt would absolutely have to be changed to accommodate non-catch Alternatives, but I'm not inspired at present):
firstAlt, lastAlt :: (Foldable f, Alternative m) => (a -> m b) -> f a -> m b
firstAlt f = getAlt #. foldMap (Alt #. f)
lastAlt f = getAlt #. getDual #. foldMap (Dual #. Alt #. f)
where (#.) :: Coercible b c => (b -> c) -> (a -> b) -> (a -> c) f #. g = coerce g
This specializes to Maybe very nicely:
firstMaybe :: Foldable f => (a -> Maybe b) -> f a -> Maybe b firstMaybe = firstAlt
lastMaybe :: Foldable f => (a -> Maybe b) -> f a -> Maybe b lastMaybe = lastAlt
_______________________________________________ Libraries mailing list Libraries@haskell.org http://www.haskell.org/mailman/listinfo/libraries