HaskellWiki

Haskell | Wiki community | Recent changes
Random page | Special pages

 

Not logged in
Log in | Help

Monad/ST

< Monad

Categories: Standard classes | Monad

ST class (base)
import Control.Monad.ST

The ST monad provides support for strict state threads.


1 A discussion on the Haskell irc

From #haskell (see 13:05:37 in the log ):


2 An explanation in Haskell-Cafe

The ST monad 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".

Now, the type of the function used to escape ST is:

runST :: forall α. (forall 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.

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.

See http://www.haskell.org/pipermail/haskell-cafe/2007-July/028233.html

Retrieved from "http://www.haskell.org/haskellwiki/Monad/ST"

This page has been accessed 1,985 times. This page was last modified 07:27, 12 July 2007. Recent content is available under a simple permissive license.