Solution (source code)

= Solution

Tie the three scaled streams back to the same shared <lazy list>:

``
hamming :: [Integer]
hamming = 1 : merge (map (2*) hamming)
                    (merge (map (3*) hamming) (map (5*) hamming))
``

The resulting values are precisely the <Hamming numbers> $2^i3^j5^k$ for nonnegative <integers> $i,j,k$. Every noninitial value has a smaller predecessor obtained by removing a factor, so the recursive demand can be supplied from earlier cells. This is the <productivity> argument for a <sorted multiplicative closure stream>. The <merge algorithm> removes duplicate representations such as $2\cdot3=3\cdot2$, retaining strict order and every generated value.