# [Haskell-cafe] Troubles understanding memoization in SOE

Peter Verswyvelen bf3 at telenet.be
Wed Sep 26 16:25:26 EDT 2007

```  Paul L wrote:

> We recently wrote a paper about the leak problem. The draft is at
I'm trying to understand the following in this paper:

(A) repeat x = x : repeat x
or, in lambdas:
(B) repeat = λx → x : repeat x
This requires O(n) space. But we can achieve O(1) space by writing instead:
(C) repeat = λx → let xs = x : xs in xs

Let me see if I understand this correctly. Since I'm an imperative
programmer, I'll try a bit of C++ here.

struct Cell : Value
{
Value* tail;
};

So in (A) and (B), a Cell c1 is allocated, and c1->head would be a
pointer to x, and c1->tail would be a pointer to a newly allocated Cell
c2, etc etc, hence O(n) space complexity
In (C) however, a Cell xs is allocated, and xs->head is also a pointer
to x, but xs->tail is a pointer the cell xs again, creating one circular
data structure, hence O(1) space complexity.

Is this more or less correct?

I'm also trying to figure out how the "fixed point combinator" works, so
the fix f = f (fix f), and it's effect on space/time complexity. Any
good tutorials on that one? Or is this the one