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--;
   }

I'm not sure, whether the compiler can eliminate the last bit of laziness that would remain in a 'cursor array'.
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to