<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body bgcolor="#ffffff" text="#000000">
<font face="Helvetica, Arial, sans-serif">The following code, when
compiled with GHC 6.6.1 --make -O </font><font
 face="Helvetica, Arial, sans-serif">gives a
stack overflow when I enter 1000000 as a command line argument:<br>
<br>
(please don't look at the efficiency of the code, it can of course be
improved a lot both in time performance and numeric precision...)<br>
<br>
</font><tt>import System<br>
<br>
</tt><tt>leibnizPI </tt><tt>:: Integer -&gt; Double<br>
</tt><tt>leibnizPI </tt><tt>n = sum (map leibnizTerm [0..n]) where<br>
&nbsp;&nbsp;&nbsp; </tt><tt>leibnizTerm </tt><tt>n = let i = fromIntegral n <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in 4 * (((-1) ** i) / (2*i+1))<br>
main = do<br>
&nbsp; args &lt;- getArgs<br>
&nbsp; let n = read (head args)<br>
&nbsp; print (</tt><tt>leibnizPI </tt><tt>n)<br>
<br>
</tt><font face="Helvetica, Arial, sans-serif">However, if I replace <br>
<br>
</font><tt>main = print (</tt><tt>leibnizPI </tt><tt>1000000)<br>
<br>
</tt><font face="Helvetica, Arial, sans-serif">is does not stack
overflow.<br>
</font><font face="Helvetica, Arial, sans-serif"><br>
Now, if I leave the original main, but replace sum in
</font><tt>leibnizPI </tt><font face="Helvetica, Arial, sans-serif">by<br>
<br>
</font><tt>mysum xs = aux 0 xs <br>
&nbsp;&nbsp;&nbsp; where <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aux s (x:xs) = aux (s+x) xs<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aux s [] = s<br>
</tt><br>
<font face="Helvetica, Arial, sans-serif">then I don't get a stack
overflow.<br>
</font><font face="Helvetica, Arial, sans-serif"><br>
However, I do get a stack overflow when I compile it without -O, in all
cases.<br>
<br>
</font><font face="Helvetica, Arial, sans-serif">This puzzles me. I
don't see any non-tail calls in my code...<br>
<br>
I guess it has to do with strictness?
<a class="moz-txt-link-freetext"
 href="http://www.haskell.org/haskellwiki/Performance/Strictness">http://www.haskell.org/haskellwiki/Performance/Strictness</a><br>
<br>
Why isn't it possible to annotate strictness on the type signature in
Haskell as in Clean? Is this on the TODO list?<br>
<br>
Many thanks,<br>
Peter<br>
<br>
<br>
</font>
</body>
</html>