Итак, я потратил часы, пытаясь выяснить, как именно этот код производит простые числа.
lazy val ps: Stream[Int] = 2 #:: Stream.from(3).filter(i =>
ps.takeWhile{j => j * j <= i}.forall{ k => i % k > 0});
Я использовал несколько printlns и т.д., но ничего не сделал яснее.
Вот что я думаю, что код делает:
/**
* [2,3]
*
* takeWhile 2*2 <= 3
* takeWhile 2*2 <= 4 found match
* (4 % [2,3] > 1) return false.
* takeWhile 2*2 <= 5 found match
* (5 % [2,3] > 1) return true
* Add 5 to the list
* takeWhile 2*2 <= 6 found match
* (6 % [2,3,5] > 1) return false
* takeWhile 2*2 <= 7
* (7 % [2,3,5] > 1) return true
* Add 7 to the list
*/
Но если я изменил j*j
в списке на 2 * 2, который, как я предполагал, будет работать точно так же, он вызывает ошибку stackoverflow.
Мне явно не хватает чего-то фундаментального здесь, и я действительно мог бы использовать кого-то, объясняющего это мне, как будто мне было пять лет.
Любая помощь будет принята с благодарностью.