On Wed, Jun 17, 2009 at 9:08 PM, Jon Strait<jstr...@moonloop.net> wrote: > I use and love Haskell, but I just have this nagging concern, that maybe > someone can help me reason about. If I'm missing something completely > obvious here and making the wrong assumptions, please be gentle. :) > > I'm reading the third (bind associativity) law for monads in this form: > > m >>= (\x -> k x >>= h) = (m >>= k) >>= h > > Now considering the definition of liftM2: > > liftM2 f m1 m2 = m1 >>= (\x1 -> m2 >>= (\x2 -> return (f x1 x2))) > > Isn't this liftM2 definition in the same form as the LHS of the third law > equation, with (\x2 -> return (f x1 x2)) being the h function?
The usual convention here is that m, k, and h are variables bound outside the scope of the law. In other words, the law only applies to expressions which can be rewritten to have the form let m = ... k = ... h = ... in m >>= (\x -> k x >>= h) In the case of liftM2, you'd have to rewrite it as, liftM2 f m1 m2 = m >>= \x -> k x >>= h where m = m1 k = \x -> m2 >>= \y -> return (x,y) h = \(x,y) -> return (f x y) which is awkward, but works perfectly fine with the third law. -- Dave Menendez <d...@zednenem.com> <http://www.eyrie.org/~zednenem/> _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe