What are the usual causes of “Error C stack overflow” in the Hugs Haskell implementation.
Share
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
This can come up if you are used to functional languages in which it is common to do tail-recursion factorization. Say you have a function:
Which, incidentally, is the same as
If we evaluate the function we can see the problem:
Now to evaluate that expression Haskell uses a stack:
And this is where an overflow can occur. If you evaluated sum [1..10^6], that stack would be a million entries deep.
But note the pathology here. You recurse over a list only to build up a huge fscking expression (“thunk”), and then use a stack to evaluate it. We would rather evaluate it as we are recursing, by making the tail recursion strict:
That says to evaluate accum before trying to evaluate the recursive call, so we get (this may take a some patience to understand):
So as we are traversing the list, we are computing the sum so we don’t have to use a deep stack to evaluate the result. This modified tail recursion pattern is encapsulated in Data.List.foldl’, so:
A good rule of thumb is to never use foldl, because it always builds up giant thunks. Use foldl’ instead. If the output type has lazy structure (eg. a list or a function), use foldr. But there is no silver bullet for avoiding a stack overflow in general, you just have to understand the evaluation behavior of your program. This can be hard sometimes.
But, if I understand correctly, a stack overflow always comes from trying to evaluate a gigantic thunk, though. So look for places where those could be created, and force evaluation to happen earlier.