Note that there is essentially no difference between f1 and f2. When
you $! in f2, all it does is ensure that the argument isn't undefined.
It doesn't evaluate any of the list. Try $!! from the DeepSeq module or
write your own list-forcing function.
For me, the following works:
f1 0 l = l
f1 n l = f1 (n-1) $!! (take 3 $ l ++ [0,1])
f $!! x = force x `seq` f x
where force [] = ()
force (x:xs) = x `seq` force xs
whereas it doesn't without the $!!.
--
Hal Daume III | [EMAIL PROTECTED]
"Arrest this man, he talks in maths." | www.isi.edu/~hdaume
> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On Behalf Of Koji Nakahara
> Sent: Wednesday, June 18, 2003 5:18 PM
> To: [EMAIL PROTECTED]
> Subject: Help: Stack-overflow and tail-recursive functions
>
>
> Hi
>
> I've written a function that is tail-recursive and takes
> a list(queue) as one of its arguments.
> However the function fails because of
> "Stack space overflow"(GHC) or "ERROR - Garbage collection
> fails to reclaim sufficient space"(hugs).
>
> For example (simplified), both of these results in
> stack-overflow: f1 100000 [0,1,2], and even f2 100000 [0,1,2],
>
> where,
> f1 0 l = l
> f1 n l = f (n-1) $ take 3 $ l ++ [0,1]
>
> f2 0 l = l
> f2 n l = f2 (n - 1) $! (take 3 $ l ++ [0,1])
>
> Why f2 overflows?
>
> How to avoid this stack-overflow?
>
> _______________________________________________
> Haskell-Cafe mailing list
> [EMAIL PROTECTED]
> http://www.haskell.org/mailman/listinfo/haskel> l-cafe
>
_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe