двойной поток, чтобы предотвратить ненужное запоминание?

Я новичок в Haskell и пытаюсь реализовать сито Эйлера в стиле потоковой обработки.

Когда я проверилСтраница Wiki Хаскелла о простых числахЯ нашел загадочную технику оптимизации для потоков. В3.8 Линейное слияние этой вики:

primesLME = 2 : ([3,5..] `minus` joinL [[p*p, p*p+2*p..] | p <- primes']) 
  where
    primes' = 3 : ([5,7..] `minus` joinL [[p*p, p*p+2*p..] | p <- primes'])

joinL ((x:xs):t) = x : union xs (joinL t)

И это говорит

Введена двойная подача простых чисел, чтобы предотвратить ненужное запоминание и, таким образом, предотвратить утечку памяти, согласно коду Мелиссы О'Нил.

Как это могло произойти? Я не могу понять, как это работает.

Ответы на вопрос(1)

Ваш ответ на вопрос