[Haskell-cafe] Type system madness

Andrew Coppin andrewcoppin at btinternet.com
Tue Jul 10 15:02:35 EDT 2007

Stefan O'Rear wrote:
> On Mon, Jul 09, 2007 at 09:57:14PM +0100, Andrew Coppin wrote:
>> (BTW... How in the hell do you get symbols like that in plain ASCII??)
> You can't, but the most commonly used replacement for ASCII
> (Unicode-UTF8) supports them just fine.

Wait... I thought Unicode was still an experimental prototype? Since 
when does it work in the real world??

> Consider the ST monad, which lets you use update-in-place, but is
> escapable (unlike IO).  ST actions have the form:
> ST s α
> Meaning that they return a value of type α, and execute in "thread" s.
> All reference types are tagged with the thread, so that actions can only
> affect references in their own "thread".

...so *that* is what that thing does...! (I thought it did something 
quite different.)

> Now, the type of the function used to escape ST is:
> runST :: ∀ α. (∀ s. ST s α) → α
> The action you pass must be universal in s, so inside your action you
> don't know what thread, thus you cannot access any other threads, thus
> runST is pure.  This is very useful, since it allows you to implement
> externally pure things like in-place quicksort, and present them as pure
> functions ∀ e. Ord e ⇒ Array e → Array e; without using any unsafe
> functions.

...so the 's' doesn't really "exist", it's just random hackery of the 
type system to implement uniqueness?

> But that type of runST is illegal in Haskell-98, because it needs a
> universal quantifier *inside* the function-arrow!  In the jargon, that
> type has rank 2; haskell 98 types may have rank at most 1.

...kinda wishing I hadn't asked... o_O

More information about the Haskell-Cafe mailing list