Learning Haskell: Scheinbar kreisförmiges Programm - Bitte helfen Sie zu erklären,

Ich gehe gerade das Buch "The Haskell Road to Logic, Math and Programming" von Doets und Van Eijck durch. Bis zu diesem Buch war ich noch nie mit einer funktionalen Programmiersprache vertrau

Noch zu Beginn des Buches gibt es den folgenden Code für einen Primalitätstest:

ldp :: Integer -> Integer
ldp n = ldpf primes1 n

ldpf :: [Integer] -> Integer -> Integer
ldpf (p:ps) n | rem n p == 0 = p 
              | p^2 > n      = n
              | otherwise    = ldpf ps n

primes1 :: [Integer]
primes1 = 2 : filter prime [3..]

prime :: Integer -> Bool
prime n | n < 1     = error "not a positive integer"
        | n == 1    = False 
        | otherwise = ldp n == n

Es gibt eine scheinbar zirkuläre Programmierung, in der ldp primes1 aufruft, das prime aufruft, das ldp erneut aufruft. Während das Buch dies als Erklärung anbietet, warum das Programm ausgeführt und beendet wird:

ldp ruft primes1 auf, die Liste der Primzahlen. Dies ist ein erstes Beispiel für eine „Lazy List“. Die Liste wird als "faul" bezeichnet, da wir nur den Teil der Liste berechnen, den wir für die weitere Verarbeitung benötigen. Um Primzahlen1 zu definieren, benötigen wir einen Primalitätstest. Dieser Test wird jedoch selbst anhand der Funktion LD definiert, die sich wiederum auf Primzahlen1 bezieht. Wir scheinen im Kreis herumzulaufen. Dieser Kreis kann unschädlich gemacht werden, indem der Primalitätstest für 2 vermieden wird. Wenn angegeben wird, dass 2 Primzahl ist, können wir die Primalität 2 in der LD-Prüfung verwenden, dass 3 Primzahl ist, und so weiter und läuf

Während ich denke, dass ich diese Erklärung verstehe, würde ich es sehr begrüßen, wenn jemand in Laienbegriffen erklären könnte:

Was ist eine "faule Liste" und wie trifft dies in diesem Zusammenhang zu?Wie kann das Programm, wenn es weiß, dass 2 Primzahl ist, bösartig sein?

Alle Antworten werden sehr geschätzt.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage