Foldr wird im Haskell Wikibook wie folgt implementiert:
%Vor%Es wird angegeben, dass der Anfangswert des Akkumulators als Argument festgelegt ist. Aber wie ich es verstehe, ist acc der Identitätswert für die Operation (z. B. 0 für Summe oder 1 für Produkt) und sein Wert ändert sich während der Ausführung der Funktion nicht. Warum wird es hier und in anderen Texten als Akkumulator bezeichnet, was bedeutet, dass es einen Wert Schritt für Schritt ändert oder anhäuft?
Ich kann sehen, dass ein Akkumulator in einer linken Falte relevant ist, wie zum Beispiel foldl, aber ist die Wikibook-Erklärung falsch und nur für die Symmetrie, in welchem Fall ist es falsch?
Berücksichtigen Sie die Auswertung eines einfachen foldr
-Ausdrucks basierend auf der (korrekten) Definition, die Sie angegeben haben:
Sie haben also recht: acc
"akkumuliert" eigentlich nichts. Es nimmt niemals einen anderen Wert als 0
an.
Warum heißt es "acc", wenn es kein Akkumulator ist? Ähnlichkeit mit foldl
? Hysterische Rosinen ? Ein Lügen für Kinder ? Ich bin mir nicht sicher.
Bearbeiten: Ich werde auch darauf hinweisen, dass die GHC-Implementierung von foldr
z
(vermutlich für null) anstatt acc
verwendet.
acc
akkumuliert im Fall von foldr
nicht wirklich irgendetwas, wie bereits erwähnt wurde.
Ich würde hinzufügen, dass ohne es nicht klar ist, was passieren soll, wenn die Eingabe eine leere Liste ist.
Es ändert auch die Typensignatur von f
, wodurch die verwendbaren Funktionen eingeschränkt werden.
Beispiel:
%Vor%Tags und Links haskell