[Haskell-cafe] Puzzled

Peter Verswyvelen bf3 at telenet.be
Fri Oct 5 15:22:21 EDT 2007


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


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20071005/2aa68e3d/attachment-0001.htm


More information about the Haskell-Cafe mailing list