2015-04-13 2 views

Antwort

6

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.

+1

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

+1

@ 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

1

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) } 
+0

dies * wird * ** flacher ** die Erträge von der zweiten 'for';) – Carsten

+0

ich meinte mehr wie Baum Traversal, wo Sie die Abflachung eines Kinderbaums mit einem einzigen Element zu kombinieren –

Verwandte Themen