2015-04-13 22 views

Odpowiedz

6

Ten wzór jest tak samo idiomatyczny, jak to tylko możliwe.

Zazwyczaj alternatywą jest wykorzystanie rurociągu funkcji wyższego rzędu jak Seq.map lub Seq.filter, ale dla konkretnego przypadku - iloczyn kartezjański - podejście ze zrozumieniem sekwencja naprawdę błyszczy i nie dostaniesz nic w pobliżu takie proste inaczej.

To połączenie osądu, którego stylu użyć. Preferuję podejście oparte na potoku, ale później zdaję sobie sprawę, jak jaśniejsze jest podejście do rozumienia sekwencji.

+1

prostu jako komentarz - ty potrzebujesz 'Seq.collect' lub' Seq.concat' (monadycznych metod) do * przetłumaczenia * czegoś z więcej niż jednego 'for' w nim (powinno być tak, ponieważ nie ma sensu używać' seq {...} 'over a simple' map' lub 'filter' inaczej – Carsten

+1

@ CarstenKönig: true - rzeczywisty przykład jak zaimplementować to używając' Seq.map' zagnieżdżonego w 'Seq.collect' jest w połączonym wątku. Zrozumienie dla prostego mapowania/filtrowania - myślę, że są tacy, którzy będą disa gree (myślę, że Tomas Petricek napisał ostatnio, że woli ten styl). – scrwtp

1

Tak długo, jak nie trzeba nic skomplikowanego, jak niezmiernie funkcji lub spłaszczenie sub-wyrażeń (yield!), można użyć nieco mniej gadatliwe składnię:

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

this * will * ** flatten ** the yields of the second 'for';) – Carsten

+0

Miałem na myśli coś więcej jak przejście drzewa, w którym łączycie spłaszczanie drzewa potomnego z uzyskaniem pojedynczego elementu –

Powiązane problemy