Remi Turk wrote:
Ah, I think I understand what we're disagreeing about exactly now. We're understanding "primitive" to mean different things :)
You're seeing runST, newSTRef, writeSTRef etc as primitives, is that correct? I see them as the public interface to something which is implemented in something else.
The advantage of seeing runST, newSTRef, writeSTRef etc as primitives is that there is a denotational semantics for them (see Laucnbury/ Peyton Jones: "State in Haskell"), which coincides with the operational semantics. This is not the case for unsafePerformIO. unsafePerformIO is a purely operational primitive, although some uses of unsafePerformIO can a posteriori (and usually with a lot of handwaving) shown to behave in a good (denotational) way. The ghc file you cite should be regarded as operational detail, not as a language definition of runST, newSTRef, and writeSTRef.
Remi "We're probably agreeing 99.9% anyway" Turk
Yes, of course. Till -- Till Mossakowski Phone +49-421-218-4683 Dept. of Computer Science Fax +49-421-218-3054 University of Bremen till@tzi.de P.O.Box 330440, D-28334 Bremen http://www.tzi.de/~till