The following code, when compiled with GHC 6.6.1 --make -O gives a stack overflow when I enter 1000000 as a command line argument:

(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...)

import System

leibnizPI :: Integer -> Double
leibnizPI n = sum (map leibnizTerm [0..n]) where
   
leibnizTerm n = let i = fromIntegral n
                in 4 * (((-1) ** i) / (2*i+1))
main = do
  args <- getArgs
  let n = read (head args)
  print (
leibnizPI n)

However, if I replace

main = print (leibnizPI 1000000)

is does not stack overflow.

Now, if I leave the original main, but replace sum in
leibnizPI by

mysum xs = aux 0 xs
    where
      aux s (x:xs) = aux (s+x) xs
      aux s [] = s

then I don't get a stack overflow.

However, I do get a stack overflow when I compile it without -O, in all cases.

This puzzles me. I don't see any non-tail calls in my code...

I guess it has to do with strictness? http://www.haskell.org/haskellwiki/Performance/Strictness

Why isn't it possible to annotate strictness on the type signature in Haskell as in Clean? Is this on the TODO list?

Many thanks,
Peter