
2009/12/29 Tony Morris
Can (liftM join .) . mapM be improved? (Monad m) => (a -> m [b]) -> [a] -> m [b]
Hi Tony I count this as a personal preference rather than an improvement: joinything2 :: (Monad m) => (a -> m [b]) -> [a] -> m [b] joinything2 = liftM join `oo` mapM oo is one of of a family of functions I use often to avoid sectioning/composing mania. It's known to Raymond Smullyan fans as 'blackbird', though I call it oo as a pun on Standard MLs o (which is Haskells (.) of course). -- | Compose an arity 1 function with an arity 2 function. -- B1 - blackbird oo :: (c -> d) -> (a -> b -> c) -> a -> b -> d oo f g = (f .) . g Extending the arity works quite nicely too: -- | Compose an arity 1 function with an arity 3 function. -- B2 - bunting ooo :: (d -> e) -> (a -> b -> c -> d) -> a -> b -> c -> e ooo f g = ((f .) .) . g ... and so on. I've used `oooo` but some how never needed `ooooo`. Due to their typographical appearance in infix form, the family name I have for them is specs (i.e. glasses, googles...) - `oo` Best wishes Stephen