[Haskell-cafe] A question about stack overflow
Chris Kuklewicz
haskell at list.mightyreason.com
Tue Jun 27 04:33:43 EDT 2006
Huazhi (Hank) Gong wrote:
> Hi, all
>
> I’m just a newbie for Haskell and functional programming world. The idea
> I currently read is quite different and interesting.
>
> I have one general question about the recursively looping style. For
> example:
>
> myMax [ ] = error “empty list”
>
> myMax [x] = x
>
> myMax [x:xs] = if x>= (myMax xs) then x else (myMax xs)
>
>
>
> I just list out this kind of very simple program. However, if the list
> size if a big number such as 10000000, the Winhug will report that the
> stack is overflow.
>
> Does it mean that the functional programming is lacking of scalability?
> I do know that we can manually change the stack size for it. But that’s
> not a good solution according to my opinion.
>
>
>
> Yours, Hank
>
The function is not "tail recursive"
Think about unfolding the recursion:
mymax [1,2,3,4] =
if 1 >= (if 2 >= (if 3 >= (4)
then 3 else (4))
then 2 else (<above>))
then 1 else (<above>)
If 4 is a long list, then the chain of "if" statements gets larger than size of
the stack that the runtime will allow. The definition you have looks like a
"right fold" where compare the head to the function applies to the remaining
list and what you need is a "left fold" where you process the list so far then
operate on the next element.
--
Chris
More information about the Haskell-Cafe
mailing list