[Haskell-cafe] Execution Contexts

Keean Schupke k.schupke at imperial.ac.uk
Sat Nov 27 07:11:32 EST 2004


Jules Bean wrote:

> A problem is the ability to pass callbacks to external libraries...

Why not just put all the state in a record, then there's only one thing to
pass around... you can use the state monad to hide this (or the state monad
transformer if you need to layer over IO) then use partial function 
application
to pass the necessary state to the callback on creation?

Also another take on the TWI question... Doesn't this equate to the same 
thing
as first class modules... then a module can be defined within the scope 
of a
function?

printablePoint x_init = do
    x <- newIORef x_init

    return $ module PrintablePoint where
       getX = readIORef x
       ...

And the above can be seen as a model of an object... So using the HList 
library
you can write this:

class_printable_point x_init self = do
    x <- newIORef x_init
    returnIO $
        mutableX .=. x
        .*. getX .=. readIORef x
        .*. moveD .=. (\d -> modifyIORef x ((+) d))
        .*. ooprint .=. ((self # getX ) >>= print)
        .*. emptyRecord

Of course true top-level TWIs behave like static objects... But with dynamic
objects you can guarantee that each object is only initialised once, but
cannot guarantee that only one object of a given type exists (and I think
encapsulation is a more important property than uniqueness).

    Keean.



More information about the Haskell-Cafe mailing list