On Sun, May 30, 2010 at 1:35 AM, Michael Vanier <mvanie...@gmail.com> wrote:
> I stumbled across this monadic combinator: > > mcombine :: Monad m => (a -> a -> a) -> m a -> m a -> m a > mcombine f mx my = do > x <- mx > y <- my > return (f x y) > > I used it to chain the outputs of two Parsec String parsers together using > this operator: > > (<++>) :: Monad m => m String -> m String -> m String > (<++>) = mcombine (++) > > mcombine seems like such a basic operation that it should be a library > function, but I couldn't find one matching it on hoogle. Is there one? > It's a lift of sorts. The tip off is the type signature. Your type is equivalent to this type: Monad m => (a -> a -> a) -> (m a -> m a -> m a) Hopefully the parens added for the grouping helps make the intuition clear. Your function takes a function and makes a new one that expects monadic parameters. Look at liftM2 in Control.Monad. More generally there is a formula here: liftM<N> f x1 .. x<N> = f` `liftM` x1 `ap` ... `ap` x<N> If you have an applicative this could also be: f <$> m1 <*> m2 HTH, Jason
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe