By default GHC runs your program on one processor; if you
want it to run in parallel you must link your program
with the <option>-threaded</option>, and run it with the RTS
- <option>-N</option> option; see <xref linkend="sec-using-smp" />).
+ <option>-N</option> option; see <xref linkend="using-smp" />).
The runtime will
schedule the running Haskell threads among the available OS
threads, running as many in parallel as you specified with the
nfib :: Int -> Int
nfib n | n <= 1 = 1
- | otherwise = par n1 (seq n2 (n1 + n2))
+ | otherwise = par n1 (seq n2 (n1 + n2 + 1))
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)</literal>. It is not sufficient
- to reorder the expression as <literal>(n2 + n1)</literal>, because
+ in the expression <literal>(n1 + n2 + 1)</literal>. It is not sufficient
+ to reorder the expression as <literal>(n2 + n1 + 1)</literal>, because
the compiler may not generate code to evaluate the addends from left to
right.</para>