[Haskell-cafe] Optimization of recursion

Alastair Reid alastair at reid-consulting-uk.ltd.uk
Tue Sep 28 18:34:48 EDT 2004


> > 1. Do Haskell interpreters/compilers perform [tail call optimization]?

Georg Martius wrote:
> ghc does it with one of -O -O1 -O2 switches.
> hugs doesn't seam to do it since [2] says that
>   foldl (\n _ -> n + 1) 0 [1..100000]
> causes a stack overflow.

All Haskell compilers (including Hugs) perform tail call optimizations.
That is, tail calls are compiled as jumps (or equivalent).

This is absolutely necessary (and, incidentally, easy) because the only way to 
write a loop in Haskell is to write a recursive function.  If recursive 
functions consumed more and more stack space with each iteration, it wouldn't 
be possible to write programs that ran for any length of time or did anything 
interesting.

The problem Georg describes is _not_ due to how tail calls are implemented.  
It is a property of lazy evaluation that you have to learn about just as 
someone used to Haskell has to learn not to write the equivalent of [0..] in 
OCaml.  (For those who don't know Haskell, "[0..]" denotes the infinite list 
of natural numbers and would quickly exhaust your memory if you tried to use 
it in a strict language.)

--
Alastair Reid


More information about the Haskell-Cafe mailing list