Я новичок в Haskell и пытаюсь внедрить Euler Sieve в стиле потоковой обработки.
Когда я проверил страницу 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)
И это говорит
" Двойной простой поток введен здесь, чтобы предотвратить ненужное запоминание и, таким образом, предотвратить утечку памяти, согласно коду Мелиссы О'Нил".
Как это могло произойти? Я не могу понять, как это работает.