= 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.
Back to article page