[Yhc] coreFunc has extra argument
Tom Shackell
shackell at cs.york.ac.uk
Tue Mar 4 11:01:18 EST 2008
Tom Hawkins wrote:
> Thanks Tom and Jeremy, this helps a lot. Actually, Tom I see you
> spelled this out for me a couple weeks ago in an earlier post. Sorry,
> I'm a bit slow.
Not at all, it's actually quite complex. It took me a couple of attempts
to get the IO type right. It has many funny features, and the reasons
that some of them are there is quite subtle :)
> So am I correct in saying that World is never reference in the
> program, it's only used to emulate imperative actions?
The value of World comes up in only two places that I know of. The first
is in the startup code. When the interpreter starts it calls the
YHC._Driver._driver function, passing it a value of type World and the
'main' function to evaluate.
_driver :: World -> IO () -> a
In fact _driver doesn't even use the World value it is passed, its
existence in that function is entirely historical and it could be
removed if anyone could be bothered :)
The second, and more useful, example is unsafePerformIO. Defined in
YHC.Internal.
unsafePerformIO :: IO a -> a
unsafePerformIO (IO f) = case f World of
_E x -> x
This takes an IO action, unpacks it, applies World to it (which the IO
action will never look at) and then gets the result.
So World is created, and passed as an argument, but (as far as I know)
it is never cased on. It's also only ever used inside the IO monad.
Hope that helps :)
Tom
More information about the Yhc
mailing list