i\'ve been trying to read a large file in haskell.
I need to compress it using a custom algorithm for a university project. Everything works fine untill i start to compr
The construct "seq x x" is always useless. If y = seq x x and I force y then this forces x then returns x. This is equivalent to y=x and forcing y. Thus "seq forceEval forceEval" does nothing more than "forceEval".
The error with your use of a fold is a common one.
You are using a fold to perform a count of the bytes in the input. You should be using a strict left fold for such a sum, but your hand written fold is a lazy left fold. The (acc+1) is not getting evaluated, so it builds 5 million nested applications: (((...(0+1)+1)+1)+1)+1)+1)...+1). Then it is forced when printing, and the evaluation tries to descend into 5 million parentheses.
Thus the pending stack has one entry for each Word8. For short inputs it reaches the end and sees 0. For long inputs it runs out of stack space with GHC because the creators and most users of GHC think that trying to allocate 5 million stack frames is usually a design error by the programmer.
I predict that you can use "seq" to fix this:
fold_tailrec' foldFun acc (x : xs) =
let acc' = foldFun acc x
in seq acc' (fold_tailrec' foldFun acc' xs)