Ich versuche F # zu lernen, indem ich einige C # -Algorithmen in idiomatische F # umschreibe.
Eine der ersten Funktionen, die ich neu schreiben möchte, ist ein batchsOf wo:
%Vor%Dies würde die Sequenz in Chargen aufteilen, mit jeweils maximal fünf, d. h.
%Vor%Mein erster Versuch, dies zu tun, ist ziemlich hässlich, wo ich nach der Fehlersuche, die versucht, den veränderbaren -Typ innerhalb des Abschlusses zu verwenden, ein veränderliches Objekt ref verwendet habe . Die Verwendung von ref ist besonders unangenehm, da es zur Dereferenzierung den ! -Operator verwenden muss, der innerhalb eines Bedingungsausdrucks gegen einige Devs kontraintuitiv sein kann, die ihn als lesen > logisch nicht . Ein anderes Problem, auf das ich stieß, ist, dass Seq.skip und Seq.take nicht wie ihre Linq-Aliase sind, da sie einen Fehler auslösen, wenn size die Größe der Sequenz überschreitet.
%Vor%Wie auch immer, was wäre die eleganteste / idiomatische Art, dies in F # umzuschreiben? Das ursprüngliche Verhalten beibehalten, aber vorzugsweise ohne die änderbare Variable ref .
Ein Freund hat mich das vor einiger Zeit gefragt. Hier ist eine recycelte Antwort. Das funktioniert und ist rein:
%Vor%Oder eine unreine Version:
%Vor% Diese erzeugen ein seq<_>
. Wenn du wirklich eine Skip
wie in deiner Probe haben musst, dann füge einfach GetEnumerator
wie in:
Hoffe das hilft!
Dies ist vielleicht nicht idiomatisch, aber es funktioniert:
%Vor%Hier ist eine einfache Implementierung für Sequenzen:
%Vor%Dies kann ohne Rekursion erfolgen, wenn Sie möchten
%Vor%Je nachdem, wie Sie das leichter verstehen können. Tomas Lösung ist wahrscheinlich mehr idiomatische F # obwohl
Ich fand das eine ziemlich knappe Lösung:
%Vor%Es arbeitet an einer Sequenz und erzeugt eine Sequenz. Die Ausgabesequenz besteht aus Listen von n Elementen aus der Eingabesequenz.
Hurra, wir können IEnumerator
, batchesOf
und IEnumerator
in F # 4 verwenden, wie von Brad Collins und Scott Wlaschin .
Meine Methode beinhaltet das Konvertieren der Liste in ein Array und das rekursive Chunking des Arrays:
%Vor%Diese Version besteht alle meine Tests, von denen ich denken könnte, dass sie eine für die faule Auswertung und die Einzelsequenz-Auswertung einschließen:
%Vor%Ich bin immer noch ziemlich neu in F #, also wenn ich etwas vermisse - bitte korrigiere mich, es wird sehr geschätzt werden.
Sie können Ihre Aufgabe mit analoger Clojure %code% Bibliotheksfunktion
Wird als %code% verwendet und bietet Ihnen die gesuchte Funktion %code% :
%Vor%Als Prämie können Sie mit %code% und %code% spielen, um überlappende Stapel zu schneiden ( sliding windows ) und sogar auf unendliche Sequenzen anzuwenden, wie unten:
%Vor%Betrachten Sie es nur als Prototyp , da es viele redundante Auswertungen über die Quellsequenz gibt und wahrscheinlich nicht für Produktionszwecke geeignet ist.
Ich versuche F # zu lernen, indem ich einige C # -Algorithmen in idiomatische F # umschreibe.
Eine der ersten Funktionen, die ich neu schreiben möchte, ist ein batchsOf wo:
%Vor%Dies würde die Sequenz in Chargen aufteilen, mit jeweils maximal fünf, d. h.
%Vor%Mein erster Versuch, dies zu tun, ist ziemlich hässlich, wo ich nach der Fehlersuche, die versucht, den veränderbaren -Typ innerhalb des Abschlusses zu verwenden, ein veränderliches Objekt ref verwendet habe . Die Verwendung von ref ist besonders unangenehm, da es zur Dereferenzierung den ! -Operator verwenden muss, der innerhalb eines Bedingungsausdrucks gegen einige Devs kontraintuitiv sein kann, die ihn als lesen > logisch nicht . Ein anderes Problem, auf das ich stieß, ist, dass Seq.skip und Seq.take nicht wie ihre Linq-Aliase sind, da sie einen Fehler auslösen, wenn size die Größe der Sequenz überschreitet.
%Vor%Wie auch immer, was wäre die eleganteste / idiomatische Art, dies in F # umzuschreiben? Das ursprüngliche Verhalten beibehalten, aber vorzugsweise ohne die änderbare Variable ref .
Ein Freund hat mich das vor einiger Zeit gefragt. Hier ist eine recycelte Antwort. Das funktioniert und ist rein:
%Vor%Oder eine unreine Version:
%Vor% Diese erzeugen ein seq<seq<'a>>
. Wenn du wirklich eine 'a list list
wie in deiner Probe haben musst, dann füge einfach ... |> Seq.map (List.ofSeq) |> List.ofSeq
wie in:
Hoffe das hilft!
Dies kann ohne Rekursion erfolgen, wenn Sie möchten
%Vor%Je nachdem, wie Sie das leichter verstehen können. Tomas Lösung ist wahrscheinlich mehr idiomatische F # obwohl
Hurra, wir können List.chunkBySize
, Seq.chunkBySize
und Array.chunkBySize
in F # 4 verwenden, wie von Brad Collins und Scott Wlaschin .
Sie können Ihre Aufgabe mit analoger Clojure partition
Bibliotheksfunktion
Wird als partition 5 5
verwendet und bietet Ihnen die gesuchte Funktion batchesOf 5
:
Als Prämie können Sie mit n
und step
spielen, um überlappende Stapel zu schneiden ( sliding windows ) und sogar auf unendliche Sequenzen anzuwenden, wie unten:
Betrachten Sie es nur als Prototyp , da es viele redundante Auswertungen über die Quellsequenz gibt und wahrscheinlich nicht für Produktionszwecke geeignet ist.
Diese Version besteht alle meine Tests, von denen ich denken könnte, dass sie eine für die faule Auswertung und die Einzelsequenz-Auswertung einschließen:
%Vor%Ich bin immer noch ziemlich neu in F #, also wenn ich etwas vermisse - bitte korrigiere mich, es wird sehr geschätzt werden.
Tags und Links linq f# functional-programming sequence