michael rice nowgate at yahoo.com
Sat Jul 24 10:42:03 EDT 2010

```Prelude Control.Monad> liftM2 (\a b -> a : b : []) "abc" "123"
["a1","a2","a3","b1","b2","b3","c1","c2","c3"]

Got it!

Thanks to all.

Michael

To: "Max Rabkin" <max.rabkin at gmail.com>
Date: Saturday, July 24, 2010, 10:35 AM

Perhaps I'm being unclear again. All I was trying to say was that:
liftM2 (-) [0,1] [2,3] /= liftM2 (-) [2,3] [0,1]

-deech

On Sat, Jul 24, 2010 at 9:30 AM, Max Rabkin <max.rabkin at gmail.com> wrote:
> On Sat, Jul 24, 2010 at 4:08 PM, aditya siram <aditya.siram at gmail.com> wrote:
>> I wouldn't-it was a bad example. My only point was that because of the
>> way (>>=) is implemented for lists the order of the arguments 'a' and
>> 'b' in 'liftM2 f a b' matters.
>>
>> -deech
>
> No, it's not. The type of liftM2 makes this clear:
>
> liftM2 :: (Monad m) => (a -> b -> r) -> m a -> m b -> m r
>
> The arguments to the function *must* come in the right order, because
> there is no way to match (a) with (m b) or (b) with (m a). Since
> liftM2 is parametrically polymorphic in (a) and (b), it can't behave
> differently in the case where (a = b).
>
> --Max
>
_______________________________________________