
Martin Drautzburg
I found some implementations of Monads in javascript, but they all do not allow capturing the intermediate results. My question is: "what is the ultimate cause for this"?
In haskell the second argument to (>>=) is a function a->Mb which can be written as a lambda expression, e.g. \x->[x]. In javascript such a function would be written as function(x) {return[x]}.
Did I get this right: in haskell the chain of >>= is constructed from the end?
Composition by (>>=) is by definition associative, so it really doesn't matter how you set your parentheses.
So chaining a->Mb and b->Mc gives you a->Mc, which is again suitable as a second argument to (>>=), right?
Yes, but beware that you may be confusing (>>=) with (>=>).
So why can't I do this is javascipt? Or can I?
I don't see why that should be a problem. Note that there are many different ways to represent monads. Haskell represents them in terms of 'fmap', 'return' and (>>=).
The reason I am asking this is because I am trying to beautify callbacks. An asynchronous ajax call needs a function argument, which will be executed once the call completes. But what if I want to take the results of the first call, do something with them and pass it to a second ajax call, where I would again have to pass another function argument. I would end up with a deeply nested structure of lambdas, something like
f(a,b,...function(...){ ... g(... function(...)
I had some hopes that chaining functions monad-style would ease my pain. I might be on the wrong track though, feel free to tell me so.
You probably are, because the usefulness of monads depends a good deal on syntax. ECMA-based languages like JavaScript, ActionScript, Haxe, etc. have a terrible syntax for anonymous functions. To give you an alternative, this really sounds like you're looking for a continuation-based solution. Continuation passing style could really solve your problem elegantly even in JavaScript. Greets, Ertugrul -- nightmare = unsafePerformIO (getWrongWife >>= sex) http://ertes.de/