Berechnung von Primzahlen in Scala: Wie funktioniert dieser Code?

Ich habe Stunden damit verbracht, herauszufinden, wie dieser Code Primzahlen erzeugt.

lazy val ps: Stream[Int] = 2 #:: Stream.from(3).filter(i =>
   ps.takeWhile{j => j * j <= i}.forall{ k => i % k > 0});

Ich habe eine Reihe von Druckern usw. verwendet, aber nichts macht es klarer.

Ich denke, dass der Code Folgendes bewirkt:

/**
 * [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
 */

Aber wenn ich mich änderej*j in der liste soll das 2 * 2 sein das ichangenommen würde genau das gleiche funktionieren, führt dies zu einem Stackoverflow-Fehler.

Ich vermisse hier offensichtlich etwas Grundlegendes und könnte wirklich jemanden gebrauchen, der mir das erklärt, als wäre ich fünf Jahre alt.

Jede Hilfe wäre sehr dankbar.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage