
Martin,
z' = [1,2,3] >>= (\y1->[y1+1] >>= (\y2->return (y1*y2)))
I'm not a Haskell expert, but I think the idea here is that the second lambda is defined *inside* the first one. I think that's the only way that it can access the first lambda's argument. I don't know much Javascript, but here is a small Perl snippet that (kinda) implements the list monad and your example: use strict ; use Data::Dumper ; sub bindM { my $xs = shift ; my $fx2ys = shift ; # maps and concats in one shot my @ys = map {@{$fx2ys->($_)}} @{$xs} ; return \@ys ; } sub returnM { my $x = shift ; return [$x] ; } sub z { my $arg = [1,2,3] ; bindM($arg, sub { my $y1 = shift ; bindM([$y1 + 1], sub { my $y2 = shift ; returnM($y1 * $y2) ; }) ; }) ; } print Dumper(z()), "\n" ; Since $y1 is local to te first lambda, you have to define the second one inside. Patrick
works again, which misled me to believe that (>>=) associates to the right.
In javascript a lambda would look like this
f = function(y1) {return [y1+1]}
I cannot see how I could possible write a function (>>=) which chains such lambdas such that I can still access the arguments outside the function bodies. It is like there are always parentheses around the lambdas. Well there actually are braces in javascript, but it can't be just the syntax.
So what is javascript missing? Is it because in haskell a lambda is just an expression wheras in javascript it is something special?
-- Martin
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
-- ===================== Patrick LeBoutillier Rosemère, Québec, Canada