[Haskell-cafe] Lazy lists simulated by unboxed mutable arrays

Henning Thielemann lemming at henning-thielemann.de
Wed May 28 14:50:15 EDT 2008

On Wed, 28 May 2008, Don Stewart wrote:

>>  by an unboxed array with a cursor to the next element to be evaluated and
>> a function that generates the next element. Whenever an element with an
>> index beyond the cursor is requested, sufficiently many new elements are
>> written to the array and the cursor is advanced. This would still allow
>> the nice tricks for recursive Fibonacci sequence definition. This will
>> obviously save memory, but can we also expect that it is noticeably faster
>> than (StrictList a) ?
> That sounds a lot like the semi-eager structure, Lazy ByteStrings,
> which do cache sized chunks of evaluation before suspending.
> With the cursor in place, it would behave more like the buffer
> abstraction to lazy bytestrings in Data.Binary?

Can you code
    fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
   with hte 'buffer'? I'm afraid you cannot simultaneously read and write 
from 'buffer', cannot 'drop' and so on, right? What I have in mind is some 
combination of a 'Data.Stream' for generating the data (playing the role 
of the unevaluated thunk), a memory chunk for buffering calculated data 
and a wrapper which provides a view on a sub-array.

Ideally 'fibs' would be translated to something like

    int *p = malloc ...;
    int *p0 = p; *p = 0; p++;
    int *p1 = p; *p = 1; p++;
    int *p2 = p;
    int i=n;
    while (i>0) {
       *p2 = *p0 + *p1;
       p0++; p1++; p2++;

I'm not sure, whether the compiler can eliminate the last bit of laziness 
that would remain in a 'cursor array'.

More information about the Haskell-Cafe mailing list