Вычисление простых чисел в Scala: как работает этот код?

Поэтому я часами пытался понять, как именно этот код выдает простые числа.

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.

Я, очевидно, здесь упускаю что-то фундаментальное, и мог бы действительно использовать кого-то, объясняющего мне это, как будто мне было пять лет.

Любая помощь будет принята с благодарностью.

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

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