[Haskell-beginners] Monads in javascript
Martin Drautzburg
Martin.Drautzburg at web.de
Thu Jul 14 20:32:29 CEST 2011
On Thursday, 14. July 2011 10:03:23 Mats Rauhala wrote:
> Could you give an example how CPS helped your situation? I'm trying to
> grok continuation passing style, but for now it just seems to complicate
> and/or slow down code (stack)
Well it turned out my problem was entirely syntax. If had understood, that an
ajax call basically looks like this:
// make two successive ajax calls
callAsync (remoteFunction1, ["arguments"], function(ret,exc) {
//do something with ret and exc
var x = ret[1]
callAsync(remoteFunction2, [x], function(ret,exc) {
// do something else
}}
You make a remote call and specify what shall happen when the call returns by
providing an anonymous callback function. The callAsync itself immediately
returns.
My only problem was the ugly nesting when I want to place multiple ajax calls
which need to be executed in a precise order as in the example above. I cannot
simply make the first call and return to make the second call. I would have no
idea where exceution would commence after the return.
That chain of function calls builds its own little world and you never
"return" from this world. This reminded me of haskell Monads which can also
create their own little worlds, where e.g. state is passed around . This is
why I asked here. But it turned out it had little to do with Monads. Still it
is a functional issue.
I believe the code above is already CPS, but very ugly. For some reason I
hadn't seen, that there is no need to define the callbacks inline, but I might
as well assign them to a variables. Then the above code looks like:
callAsync (remoteFunction1, ["arguments"], callback1);
var callback1 = function(ret,exc) {
//do something with ret and exc
var x = ret[1]
callAsync(remoteFunction2, [x], callback2)
}
var callback2 = function(ret,exc) {
// do something else
}
This is more gentle to my eyes.
The only difficulty is that callback1 and callback2 need to be defined at the
time callAsync is called. Usually this is the case. I could of course reverse
the order, which would make things safer, but then control will flow bottom-
up, whereas all the regular code executes top-down.
--
Martin
More information about the Beginners
mailing list