2016-04-30 6 views
2

Ich evaluiere einen iterativen Algorithmus in F #, wobei der aktuelle Zeitschritt die Lösung (Zustand) des vorherigen Zeitschritts benötigt. Im Fall der ersten Iteration sollte die Anfangsbedingung, dh auf 0F # verwende vorherige ausgewertete Lösung (Zustand) während der Zuordnung

einstellbar sein Dies wäre analog zu:

let answer = List.map (fun x -> x + previousAnswer) 0 someData 

Was will ich eine Falte ähnlich ist, aber wo die vorherige Lösung (state) ist nicht akkumuliert, sondern einfach zugänglich. Was ist die korrekte Funktionsweise einer solchen Operation?

Dank!

+0

[ ' Seq.unfold "] (https://msdn.microsoft.com/en-us/library/ee340363.aspx)? –

+0

[Seq.reduce] (https://msdn.microsoft.com/en-us/library/ee353740.aspx)? –

+0

Warum ist 'List.map' falsch initialisiert? die Signatur von 'List.map' ist' ('T ->' U) -> 'T-Liste ->' U-Liste ', die eine Funktion erwartet, '(fun x -> x + previousAnswer)' und eine Startliste ' 'T-Liste', nicht 'someData 0'? –

Antwort

4

fold, die alle Zwischenwerte zurückgibt, da eine neue Sequenz traditionell als scan bezeichnet wird. Und in der Tat, F # Standardbibliotheken liefern Implementierungen von scan für alle grundlegenden Sammlungen:

let answers = List.scan (fun previousAnswer x -> x + previousAnswer) 0 someData 

(auch beachten, dass in Ihrem Beispiel haben Sie map Argumente umgedreht - es 0 someData sein sollte, nicht someData 0)

+0

Vielen Dank, ich schätze meine Karte mit zusätzlichen Eingaben Analogie war nicht sehr klar :) – rbonallo

+0

Wenn meine Antwort Ihnen geholfen hat, würden Sie darüber nachdenken, es zu akzeptieren? –