
Bulat Ziganshin wrote:
Hello Andrew,
Friday, November 30, 2007, 12:10:16 AM, you wrote:
I don't understand the ST monad.
From what I can tell, it's not definable without using strange language extensions. (I don't really like using things where it's unclear why it works.)
this extension used only to guarantee referential transparency, so you don't need to understand it to use ST
if you still want, it's not that hard - rank-2 forall type used here to guarantee that code executed by runST is compatible with *any* return type which makes it impossible to return "innards" of this computation and therefore forces your code to be referential transparent
runST may be defined without rank-2 type. it doesn't change anything in its low-level working (this rank-2 type is just empty value, like RealWorld), but allows you to break referential transparency:
main = do a <- runST (do a <- newArray return a) ... x <- runST (do x <- readArray a return x) ...
low-level implementation of all ST-bound operations is just direct call to equivalent IO operation:
newSTArray = unsafeIOtoST newIOArray readSTArray = unsafeIOtoST readIOArray
where unsafeIOtoST - just code-less cast operation
Mmm, so basically it's rank-2 types I don't understand. ;-) Well anyway, given the multiple replies I've had, I now have some idea how this stuff works...