[Haskell-cafe] Continuations

Joel Reymont joelr1 at gmail.com
Fri Dec 23 04:49:19 EST 2005


Folks,

My current setup involves threads that block on a MVar/TMVar until  
they read an event from it and then proceed. I would like to convert  
these threads into continuations whereby a continuation is saved when  
an event is requested and I can call that continuation when an even  
arrives.

I had done this in Lisp before like this:

(defun/cc receive (game)
   (let/cc k
     ;; save continuation
     (setf (continuation game) k)
     ;; TODO: start a timer here
     ))

(defun/cc ask-for-blind (game amount context)
   (let ((posted nil)
         (seat nil)
         (active (car context))
         (small-blind-p (= (small-blind$ game) amount)))
     (while (and (not posted) (car active))
       (setf seat (pop active))
       ;; skip people who are waiting
       ;; for the big blind if small blind
       ;; is being posted.
       (unless (and (waiting-for-bb-p seat)
                    small-blind-p)
         (setf (state seat) 'sitting-out)
         (setf (current game) seat)
         (send (player seat) 'blind amount)
         (let* ((cmd (receive game)) <------- note the call to  
receive here
                (action (first cmd))
                (bet (second cmd))
                (inplay$ (inplay$ (player seat))))
...

How would this translate into Haskell and the Cont monad?

Alternatively, I would appreciate an example that requests, say, two  
Ints by saving a continuation each time and returns the sum.

	Thanks, Joel

--
http://wagerlabs.com/







More information about the Haskell-Cafe mailing list