Frage
In Struktur und Interpretation von Computerprogrammen (SICP) Abschnitt 2.2.3 mehrere Funktionen definiert werden mit:
(accumulate cons nil
(filter pred
(map op sequence)))
Zwei Beispiele, die nutzen diese arbeiten auf einer Liste der Fibonacci-Zahlen, even-fibs
und list-fib-squares
.
Die accumulate, Filter- und Kartenfunktionen sind in Abschnitt 2.2 als auch definiert. Der Teil, den ich ist verwirrend ist, warum die Autoren die accumulate
hier eingeschlossen. accumulate
nimmt 3 Parameter:
-
Eine binäre Funktion angewendet werden soll
-
Ein Anfangswert, wie der am weitesten rechts liegenden Parameter an die Funktion verwendet
-
Eine Liste, auf die die Funktion
angewendet wird
Ein Beispiel für accumulate auf eine Liste der Anwendung der Definition in dem Buch mit:
(accumulate cons nil (list 1 2 3))
=> (cons 1 (cons 2 (cons 3 nil)))
=> (1 2 3)
Da der dritte Parameter ist eine Liste, (accumulate cons nil some-list)
wird nur some-list
zurückkehren, und in diesem Fall ist das Ergebnis von (filter pred (map op sequence))
ist eine Liste.
Gibt es einen Grund für diese Verwendung von accumulate
andere als die Übereinstimmung mit anderen ähnlich strukturierten Funktionen im Abschnitt?
Lösung
Ich bin sicher, dass diese beiden Verwendungen von accumulate
sind lediglich illustrativ für die Tatsache, dass „consing Elemente eine Liste zu konstruieren“ kann als ein akkumulativen Prozess in der gleichen Weise behandelt wird, dass „Zahlen multipliziert ein Produkt zu erhalten“ oder " Summieren Zahlen insgesamt“kann zu erhalten. Sie haben Recht, dass die Akkumulation ist effektiv eine no-op.
(abgesehen. Beachten Sie, dass dies offensichtlich ein nützlicher Betrieb, wenn die Ausgabe von filter
und Eingabe von accumulate
keine Liste war sein könnte, zum Beispiel, wenn es eine träge erzeugte Sequenz dargestellt)