Here's a version that works:

*import Control.DeepSeq*

list = [1,2,3,4,5]

advance l = *force $* map (\x -> x+1) l

run 0 s = s
run n s = run (n-1) $ advance s

main = do
        let s =  run 50000000 list
        putStrLn $ show s

The problem is that you build of a huge chain of updates to the list. If we
just "commit" each update as it happens, we'll use a constant amount of
memory.

Haskell's laziness is tricky to understand coming from imperative
languages, but once you figure out its evaluation rules, you'll begin to
see the elegance.

Ηope this helps,
  - Clark


On Wed, Nov 28, 2012 at 7:07 AM, Benjamin Edwards <edwards.b...@gmail.com>wrote:

> TCO + strictnesses annotations should take care of your problem.
> On 28 Nov 2012 11:44, "Branimir Maksimovic" <bm...@hotmail.com> wrote:
>
>>  Problem is following short program:
>> list = [1,2,3,4,5]
>>
>> advance l = map (\x -> x+1) l
>>
>> run 0 s = s
>> run n s = run (n-1) $ advance s
>>
>> main = do
>>         let s =  run 50000000 list
>>         putStrLn $ show s
>>
>> I want to incrementally update list lot of times, but don't know
>> how to do this.
>> Since Haskell does not have loops I have to use recursion,
>> but problem is that recursive calls keep previous/state parameter
>> leading to excessive stack.and memory usage.
>> I don't know how to tell Haskell not to keep previous
>> state rather to release so memory consumption becomes
>> managable.
>>
>> Is there some solution to this problem as I think it is rather
>> common?
>>
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe@haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to