Am meisten idiomatische Art, Chargen zu schreiben

8

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 .

    
mythz 22.09.2011, 05:19
quelle

10 Antworten

14
___ answer7518857 ___

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:

hinzu %Vor%

Hoffe das hilft!

    
___ qstnhdr ___ Am meisten idiomatische Art, Chargen zu schreiben ___ answer7511165 ___

Dies ist vielleicht nicht idiomatisch, aber es funktioniert:

%Vor%     
___ answer7516767 ___

Hier ist eine einfache Implementierung für Sequenzen:

%Vor%     
___ answer7510158 ___

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

    
___ answer30810450 ___

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.

    
___ answer41016813 ___

Hurra, wir können IEnumerator , batchesOf und IEnumerator in F # 4 verwenden, wie von Brad Collins und Scott Wlaschin .

    
___ answer15797055 ___

Meine Methode beinhaltet das Konvertieren der Liste in ein Array und das rekursive Chunking des Arrays:

%Vor%     
___ answer15788443 ___

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.

    
___ tag123f ___ F # ist eine prägnante, ausdrucksstarke und effiziente funktionale und objektorientierte Sprache für .NET, mit der Sie einfachen Code zur Lösung komplexer Probleme schreiben können. ___ tag123funktionale Programmierung ___ Funktionale Programmierung ist ein Programmierparadigma, das auf der Erzeugung von Abstraktionen unter Verwendung von Funktionen basiert, die Nebeneffekte und Zustandsänderungen vermeidet. Reine funktionale Programmierung ist threadsicher. ___ answer7524665 ___

Sie können Ihre Aufgabe mit analoger Clojure %code% Bibliotheksfunktion unten:

%Vor%

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.

    
___ qstntxt ___

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 .

    
___ tag123sequenz ___ Eine Sequenz ist eine geordnete Liste von Objekten (oder Ereignissen). Wie eine Menge enthält sie Elemente (auch Elemente oder Terme genannt) und die Anzahl der Terme (möglicherweise unendlich) wird als Länge der Sequenz bezeichnet. Im Gegensatz zu einer Menge ist die Reihenfolge wichtig, und genau dieselben Elemente können mehrmals an verschiedenen Positionen in der Sequenz erscheinen. In einer relationalen Datenbank ist eine Sequenz ein Objekt, das zum Generieren eindeutiger Zahlen für einen Primärschlüssel verwendet wird. ___ tag123linq ___ Die Language Integrated Query (LINQ) ist eine Microsoft .NET Framework-Komponente, die native Datenabfragefunktionen zu .NET-Sprachen hinzufügt. Bitte denken Sie bei Bedarf daran, ausführlichere Tags zu verwenden, zum Beispiel [linq-to-sql], [linq-to-entities] / [entity-framework] oder [plinq] ___
Tomas Petricek 22.09.2011, 05:46
quelle
8

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:

hinzu %Vor%

Hoffe das hilft!

    
AshleyF 22.09.2011 17:20
quelle
4

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

    
John Palmer 22.09.2011 05:58
quelle
1

Dies ist vielleicht nicht idiomatisch, aber es funktioniert:

%Vor%     
Lars 22.09.2011 07:32
quelle
1

Hier ist eine einfache Implementierung für Sequenzen:

%Vor%     
Daniel 22.09.2011 14:48
quelle
1

Meine Methode beinhaltet das Konvertieren der Liste in ein Array und das rekursive Chunking des Arrays:

%Vor%     
sosha 03.04.2013 20:07
quelle
1

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.

    
RalfW 12.06.2015 19:05
quelle
1

Hurra, wir können List.chunkBySize , Seq.chunkBySize und Array.chunkBySize in F # 4 verwenden, wie von Brad Collins und Scott Wlaschin .

    
eug 07.12.2016 11:56
quelle
0

Sie können Ihre Aufgabe mit analoger Clojure partition Bibliotheksfunktion unten:

%Vor%

Wird als partition 5 5 verwendet und bietet Ihnen die gesuchte Funktion batchesOf 5 :

%Vor%

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:

%Vor%

Betrachten Sie es nur als Prototyp , da es viele redundante Auswertungen über die Quellsequenz gibt und wahrscheinlich nicht für Produktionszwecke geeignet ist.

    
Gene Belitski 23.09.2011 05:31
quelle
0

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.

    
vokhot 03.04.2013 13:18
quelle