L'original, en scheme

(define (foo x)
   (+ 1
      (call/cc
        (lambda (k)
          (+ 2 (k x))))))
(display (foo 41))


Quelques versions en Haskell

sorear x = do
   r <- callCC (\k -> do
     r <- k x
     return (r + 2))
   return (r + 1)
runso = runCont (sorear 41) print

p x = callCC (\k->(k x) >>=(\x->return(2+x))) >>= (\x -> return (1+x))
runp = runCont (p 41) print

r x = (return.(+1))=<<(callCC$ \k->(return.(+2))=<<(k x))
runr = runCont (r 41) print


J'aime bien les monades, même si de temps à autres, ca rend le code quelque peu imbitable... :)

P!