accumulator

___ tag123haskell ___ Haskell ist eine funktionale Programmiersprache mit starker statischer Typisierung, verzögerungsfreier Auswertung, umfangreicher Parallelitäts- und Parallelitätsunterstützung und einzigartigen Abstraktionsfunktionen. ___ answer17514320 ___

Mit %code% monad kann es etwa so aussehen:

%Vor%     
___ tag123recursion ___ Rekursion ist eine Art Funktionsaufruf, bei dem sich eine Funktion selbst aufruft. Solche Funktionen werden auch rekursive Funktionen genannt. Strukturelle Rekursion ist eine Methode zur Problemlösung, bei der die Lösung eines Problems von Lösungen für kleinere Instanzen des gleichen Problems abhängt. ___ qstnhdr ___ Rekursive Status-Monade zum Akkumulieren eines Wertes beim Erstellen einer Liste? ___ tag123statemonad ___ Eine Monade, die es erlaubt, Zustandsinformationen an Berechnungen anzuhängen ___ qstntxt ___

Ich bin völlig neu bei Haskell, also entschuldige mich, wenn die Frage albern ist.

Ich möchte rekursiv eine Liste erstellen, während gleichzeitig einen auf den rekursiven Aufrufen basierenden akkumulierten Wert aufbaut. Dies ist für ein Problem, das ich für einen Coursera-Kurs mache, also werde ich nicht das genaue Problem, sondern etwas Analoges posten.

Sagen wir zum Beispiel, ich wollte eine Liste von Ints nehmen und jede einzelne verdoppeln (ich ignoriere für den Zweck des Beispiels, dass ich einfach %code% verwenden könnte), aber ich auch wollte mitzählen Wie oft erscheint die Nummer "5" in der Liste.

Um die Verdoppelung zu machen, könnte ich das tun:

%Vor%

So weit so einfach. Aber wie kann ich auch angeben, wie oft %code% eine Fünf ist? Die beste Lösung, die ich habe, ist, einen expliziten Akkumulator wie diesen zu verwenden, den ich nicht mag, da er die Liste umkehrt, also müssen Sie am Ende eine Umkehrung durchführen:

%Vor%

Aber ich denke, das sollte besser mit der %code% monad behandelt werden, die ich vorher noch nicht benutzt habe, aber wenn ich versuche, eine Funktion zu erstellen, die zu dem Muster passt, das ich gesehen habe, bleibe ich stecken wegen des rekursiven Aufrufs von %code% . Gibt es einen schöneren Weg, dies zu tun?

EDIT: Ich brauche das für sehr lange Listen, also müssen rekursive Aufrufe auch tail-rekursiv sein. (Das Beispiel, das ich hier habe, schafft es dank Haskells "Schwanzrekursion modulo contras", rekursiv zu werden.)

    
___ tag123acculator ___ Ein Akkumulator ist ein Register in einem Computerprozessor, in dem arithmetische und logische Zwischenergebnisse gespeichert werden. ___ answer17512653 ___

Dies ist eine einfache Falte

%Vor%

oder ausgedrückt mit %code%

%Vor%

Der akkumulierte Wert ist ein Paar beider Operationen.

Hinweise:

  • Schauen Sie sich Schöne Faltung an. Es zeigt eine schöne Möglichkeit, solche Berechnungen zusammensetzbar zu machen.
  • Sie können %code% auch für die gleiche Sache verwenden, indem Sie jedes Element als statusbehaftete Berechnung betrachten. Das ist ein bisschen zu viel, aber sicher möglich. Tatsächlich kann jede Faltung als eine Folge von %code% Berechnungen ausgedrückt werden:

    %Vor%

    Funktion %code% bildet zuerst jedes Element von %code% auf eine statusbehaftete Berechnung von %code% ab. Dann kombiniert es eine Liste solcher Berechnungen in eine vom Typ %code% (es verwirft die Ergebnisse der monadischen Berechnungen, behält nur die Effekte bei). Schließlich führen wir diese Stateful Berechnung auf %code% aus.

___
2
Antworten

Spark verliert println () auf stdout

Ich habe den folgenden Code: %Vor% Dann ist der blueCount nicht Null, aber ich habe keinen println () Ausgang! Fehle ich hier etwas? Danke!     
20.10.2015, 00:14
2
Antworten

Rekursive Status-Monade zum Akkumulieren eines Wertes beim Erstellen einer Liste?

Ich bin völlig neu bei Haskell, also entschuldige mich, wenn die Frage albern ist. Ich möchte rekursiv eine Liste erstellen, während gleichzeitig einen auf den rekursiven Aufrufen basierenden akkumulierten Wert aufbaut. Dies ist für ein Pro...
07.07.2013, 13:17