2015-04-13 9 views

risposta

6

Questo schema è tanto idiomatico quanto diventa.

solito alternativa è quella di utilizzare una pipeline di funzioni di ordine superiore come Seq.map o Seq.filter, ma per il vostro caso particolare - prodotto cartesiano - un approccio di comprensione sequenza brilla davvero e non sarà possibile ottenere nulla vicino così semplice altrimenti.

In pratica si tratta di una chiamata di giudizio che stile usare. Io tendo a preferire l'approccio della pipeline, solo per rendermi conto di quanto sia più chiaro un approccio di comprensione della sequenza.

+1

proprio come un commento - si ho bisogno di 'Seq.collect' o' Seq.concat' (i metodi monadici) per * tradurre * qualcosa con più di un 'for' in esso (dovrebbe essere il caso in quanto non ha senso usare' seq {...} 'su una semplice' mappa' o 'filtro' altrimenti – Carsten

+1

@ CarstenKönig: true - un vero esempio di come implementarlo usando' Seq.map' nidificato in 'Seq.collect' si trova nel thread collegato. comprensione per la semplice mappatura/filtraggio - Penso che ci siano alcuni che sarebbero disa gree (Penso che Tomas Petricek abbia recentemente scritto che preferisce quello stile). – scrwtp

1

Finché, come non hai bisogno di nulla di complicato, come le caratteristiche imperative o di appiattimento di sub-espressioni (yield!), è possibile utilizzare una sintassi un po 'meno verbose:

seq { for item1 in list1 do 
     for item2 in list2 -> f(item1, item2) } 
+0

questo * si * ** appiattisce ** i rendimenti dal secondo 'for';) – Carsten

+0

intendevo più come tree traversal, dove si combina l'appiattimento di un albero figlio con la generazione di un singolo elemento –

Problemi correlati