Erstellen einer Liste durch kumulatives Hinzufügen von Elementen einer anderen Liste: Haskell

8

Ich kann anscheinend keine Informationen über eine Funktion höherer Ordnung finden, die dies tun würde. Ich fand einen Hinweis auf Cadd einige Stellen, konnte aber keine Informationen in einer Haskell API finden.

Ich möchte einfach nur eine Liste von Schwimmern nehmen und daraus eine weitere Liste erstellen, indem ich sie kumulativ addiere. Die ursprüngliche Liste beginnt immer mit Null. Wenn ich also eine Liste von [0,2,5,9] hätte, würde ich eine Liste von [0,2,7,16] bekommen.

%Vor%

Ich habe andere Teile dieses Codes, die Dinge tun, aber ich kann nicht scheinen, wie man diese Liste macht.

    
Derek Meyer 09.11.2011, 00:41
quelle

4 Antworten

19

Klingt so, als ob Sie eine Variante von scanl wollen, die mit foldl verwandt ist, aber eine Liste von Zwischenergebnissen erstellt. Während also foldl (+) 0 eine Liste zusammenfasst, erstellt scanl (+) 0 eine Liste von Partialsummen. Hier wollen Sie wahrscheinlich scanl1 (+) , das am Anfang keine extra Null hinzufügt.

%Vor%     
hammar 09.11.2011, 00:46
quelle
5

Ich denke, eine imperative Version dieses Codes in einen funktionalen Stil übersetzen zu können, ist auf lange Sicht ein schöner Trick. So würde ich dieses Problem in einer dieser barbarischen Imperativsprachen lösen:

%Vor%

Beachten Sie, dass wir hier zwei Variablen haben - die Liste der Zahlen und die rollende Summe. Wenn wir dieses Stück Code in einen funktionalen Stil umwandeln, müssen wir in der Regel Schleifen in (Schwanz-) Rekursion und Variablen in Funktionsargumente verwandeln (da dies der einzige Ort ist, an dem sie "mutieren" können).

%Vor%

Wir können jetzt versuchen, den Basisfall herauszufinden ...

%Vor%

... der rekursive Fall

%Vor%

... und schließlich verwenden Sie die Elternfunktion, um die Variable zu initialisieren

%Vor%     
hugomg 09.11.2011 00:47
quelle
3

Beachten Sie, dass die fold -Funktionen eine Akkumulatorvariable beliebigen Typs verwenden können - sogar ein Tupel, in dem ein Element enthalten ist ist die kumulative Summe und das zweite Element ist die Liste der vorherigen kumulativen Summen.

    
sarnold 09.11.2011 00:46
quelle
3

Viel weniger cool als hammars Antwort, aber eine andere Lösung:

%Vor%     
Ian Henry 09.11.2011 00:50
quelle

Tags und Links