[Haskell-cafe] Flattening tail recursion?
Ben Rudiak-Gould
Benjamin.Rudiak-Gould at cl.cam.ac.uk
Fri Dec 10 10:47:00 EST 2004
GoldPython wrote:
>I know there's
>"length" to count the elements in a list and it works fine, but the
>function below stack overflows on a large list.
>
> countLines [] = 0
> countLines (_:ls) = 1 + countLines ls
>
>I would have thought that this was tail recursive and would be
>flattened into iteration by the compiler.
This is not tail recursive as written. SICP section 1.2.1 does a good
job of explaining how to tell the difference:
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2.1
The analysis in Haskell is a bit different in general because reductions
are applied in a different order, but in this case it's exactly the same.
Some compilers might indeed optimize your code into a tail-recursive
version, but there's a catch: the optimization depends on the
commutativity and associativity of (+), which doesn't hold for arbitrary
types in Num. Try giving countLines an explicit type signature like
([a] -> Int) and see if that helps.
-- Ben
More information about the Haskell-Cafe
mailing list