Concurrent Haskell

A ThreadId is an abstract type representing a handle to a thread.
ThreadId is an instance of Eq, Ord and Show, where
the Ord instance implements an arbitrary total ordering over
ThreadIds. The Show instance lets you convert an arbitrary-valued
ThreadId to string form; showing a ThreadId value is occasionally
useful when debugging or diagnosing the behaviour of a concurrent
program.

Note: in GHC, if you have a ThreadId, you essentially have
a pointer to the thread itself. This means the thread itself can't be
garbage collected until you drop the ThreadId.
This misfeature will hopefully be corrected at a later date.

Note: Hugs does not provide any operations on other threads;
it defines ThreadId as a synonym for ().

Note that in forkFinally action and_then, while the forked
action and the and_then function have access to the captured
state, all their side-effects in m are discarded. They're run
only for their side-effects in IO.