</para><para>
To the programmer, Concurrent Haskell introduces no new language constructs;
rather, it appears simply as a library, <ulink
- url="http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Concurrent.html">
+ url="../libraries/base/Control-Concurrent.html">
Control.Concurrent</ulink>. The functions exported by this
library include:
<itemizedlist>
it.</para>
<para>The main library you need to use STM is <ulink
- url="http://www.haskell.org/ghc/docs/latest/html/libraries/stm/Control-Concurrent-STM.html">
+ url="../libraries/stm/Control-Concurrent-STM.html">
Control.Concurrent.STM</ulink>. The main features supported are these:
<itemizedlist>
<listitem><para>Atomic blocks.</para></listitem>
nfib :: Int -> Int
nfib n | n <= 1 = 1
- | otherwise = par n1 (seq n2 (n1 + n2 + 1))
+ | otherwise = par n1 (seq n2 (n1 + n2))
where n1 = nfib (n-1)
n2 = nfib (n-2)</programlisting>
(leaving the parent to evaluate the other branch). Also, we must use
<function>seq</function> to ensure that the parent will evaluate
<varname>n2</varname> <emphasis>before</emphasis> <varname>n1</varname>
- in the expression <literal>(n1 + n2 + 1)</literal>. It is not sufficient
- to reorder the expression as <literal>(n2 + n1 + 1)</literal>, because
+ in the expression <literal>(n1 + n2)</literal>. It is not sufficient
+ to reorder the expression as <literal>(n2 + n1)</literal>, because
the compiler may not generate code to evaluate the addends from left to
right.</para>