Sat Jul 16 10:43:38 CEST 2011

Using the CPS monad

I'm trying to record my aha here.  Starting from understanding the
basic idea behind the CPS monad (see previous post) I started writing
down some computations.  Forgive my half-assed terminology but this is
an important relaxation in my head..

I started with the sine function (sin).  The really strange thing here
is that instead of a (CPS a) type popping up, what happens is that an
(a -> CPS a) type pops up very naturally.  I.e. (CPS a) is only the
_result_ of a computation, i.e. a thunk already bound to an input.

What happens is that I first wrote down the wrong type, thinking
"taking the sine of something is a computation"

  (WRONG)    sinCPS :: CPS Floating

But that only specifies the _output_:

  (WRONG)    sinCPS = CPS(\k -> k (sin <what???>))

The solution to that is of course glaringly obvious:

  sinCPS :: Floating -> CPS Floating

  sinCPS t = CPS(\k -> k (sin t))

note that here CPS is already partially aplied: the return value
parameter is not important for the monadic mojo.