Gibt es einen idiomatischen Weg, um dieses Muster in F # auszudrücken:F #: Gibt es einen idiomatischen Weg, um for seq {} Ausdrücke zu ersetzen?
seq {
for item1 in list1 do
for item2 in list2 do
yield f(item1,item2)
}
Dank!
Gibt es einen idiomatischen Weg, um dieses Muster in F # auszudrücken:F #: Gibt es einen idiomatischen Weg, um for seq {} Ausdrücke zu ersetzen?
seq {
for item1 in list1 do
for item2 in list2 do
yield f(item1,item2)
}
Dank!
Dieses Muster ist so idiomatisch wie es nur geht.
Regel eine Alternative ist eine Pipeline von Funktionen höherer Ordnung wie Seq.map
oder Seq.filter
, sondern auch für Ihren speziellen Fall zu verwenden - cartesianischen Produkt - eine Sequenz Verständnis Ansatz wirklich glänzt und Sie werden nicht alles in der Nähe von diesen einfachen sonst bekommen.
Äußerlich ist es ein Urteilsspruch, welchen Stil zu verwenden. Ich bevorzuge den Pipeline-Ansatz, um später zu erkennen, wie viel klarer ein Sequenzverständnisansatz ist.
Solange, wie Sie nicht kompliziert etwas brauchen, wie zwingend notwendig, Merkmale oder Abflachung der Unterausdrücke (yield!
), können Sie eine etwas weniger ausführlich Syntax:
seq { for item1 in list1 do
for item2 in list2 -> f(item1, item2) }
dies * wird * ** flacher ** die Erträge von der zweiten 'for';) – Carsten
ich meinte mehr wie Baum Traversal, wo Sie die Abflachung eines Kinderbaums mit einem einzigen Element zu kombinieren –
nur als Kommentar - Sie brauche 'Seq.collect' oder' Seq.concat' (die monadischen Methoden), um etwas mit mehr als einem 'for' zu übersetzen (sollte der Fall sein, da es keinen Sinn macht,' seq {...} zu verwenden 'über eine einfache' map' oder 'filter' sonst. – Carsten
@ CarstenKönig: true - ein aktuelles Beispiel, wie man es implementiert, indem man' Seq.map' in 'Seq.collect' verschachtelt, ist im verknüpften Thread Verständnis für einfaches Mapping/Filtering - ich denke, es gibt einige, die disa würden gree (Ich glaube, Tomas Petricek hat kürzlich geschrieben, dass er diesen Stil bevorzugt). – scrwtp