Przeczytaj sekcję o tym, jak kompilator obsługuje forwyrażenia w odwołaniu do języka. Może to dać kilka wskazówek.
Dirk
@tstenner: Tak długo, jak opieramy się na lakonicznych memach: Google jest Twoim przyjacielem.
Chuck
4
@aishwarya To bardziej jak „Po prostu użyj płaskiej mapy na swojej liście / tablicy / opcji”, a nie „gówno” jak w „złym”
tstenner,
1
Właściwie to konkretna fraza została (oczywiście) wyrwana z kontekstu, gdzie ktoś przegapił monadę Baru (Czytelnika) gdzieś na Manhattanie ;-) Jak to bywa w takich przypadkach, krótka wersja utknęła.
Roland Kuhn
Odpowiedzi:
55
Powodem tego wyrażenia jest to, że możesz zastąpić wiele żmudnego kodu if / then / else, który napiszesz, wywołaniami flatMap (i innych funkcji wyższego rzędu).
Ale dotyczy to też innych monad (chociaż muszę przyznać, że nie rozumiem jeszcze szczegółów)
Wyobraź sobie sytuację, w której masz kolekcję, do której chcesz zastosować funkcję (lub serię funkcji), w której każda funkcja może zwrócić wartość null. Kiedy faktycznie używasz null, twój kod będzie podziurawiony zerowymi kontrolami. Ale jeśli użyjesz opcji zamiast wartości, możesz po prostu zmapować wartości z pożądanymi funkcjami, łącząc funkcje w łańcuch w przypadku wielu funkcji i uzyskać kolekcję z wynikami, które nie są zerowe, co w wielu przypadkach jest dokładnie tym, co chcesz.
Ponieważ ten opis jest dość zawiły, krótsza rada „tylko płaska mapa tego gówna” przyjęła się.
Osobiście używam czasami monady listy do radzenia sobie z kombinacjami.
Dan Burton,
103
Słyszałem historię, że dwóch wybitnych programistów Scala łączyło się w pary, gdy jeden z nich zaczął pisać taki kod:
option match{caseSome...
W którym momencie drugi powiedział: „Co to jest? Amatorska godzina? Płaska mapa to gówno!”
A jeśli chodzi o to, co jest tak potężne flatMap, cóż ... Po pierwsze, jest to podstawowy operator monadyczny. Oznacza to, że jest to wspólna operacja współdzielona na przykład przez kontenery (takie jak Optionkolekcje itp.), Kontynuacje, stan itp. Po drugie, podczas gdy można zdekonstruować operację Option, która w przeciwieństwie do flatMapoperacji nie jest operacją monadyczną , więc nie może być tak szeroko stosowany. Wymaga również zbyt dużej wiedzy na temat danych, którymi manipulujesz.
Uwaga: wcześniej powiedziałem, że dopasowywanie jest wolniejsze niż flatMap- prawdę mówiąc jest odwrotnie, aż do najnowszej wersji Scali w momencie pisania tego tekstu, 2.10.1.)
Tymi dwoma programistami byliśmy ja i Paul Chiusano.
Apocalisp
1
Jeśli dobrze pamiętam, czy #legendofklang nie pojawił się na Twitterze mniej więcej w tym samym czasie ... co jest często przyczyną błędnego przypisania płaskiej mapie tego gównianego mema? Powinniśmy zrobić coś w rodzaju wpisu wiki Scala meme; jest teraz kilka niesamowitych!
Tymoteusza
3
@WillSargent Myślę, że to brak lasu dla drzew. Zaletą jest to, że komponuje się . Jeśli mam funkcję zależną od czterech monad, mogę pisać val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d). Mogę dodać więcej monad, usunąć monady i pozostaje bez zmian. Zauważ też, że nie rozkłada się na String, ale na Option[String]. Chociaż w rzeczywistości w ogóle się nie rozkłada. Jednym z powodów, dla których niektórzy ludzie nie lubią używać kontenerów jako przykładów dla monad, jest to, że możesz wyjmować rzeczy z kontenerów, ale nie wszystkie monady na to pozwalają.
Najważniejsze flatMapjest to, że jest to reprezentacja operacji wiązania monadycznego w Scali. W sieci jest wiele samouczków wyjaśniających cel monad i dlaczego są one tak przydatne; James Iry ma taki, który zawiera pewne szczegóły.
Myślę, że to poprawna odpowiedź, Optionto tylko jeden z wielu flatMapprzypadków użycia. Oczywiście, jeśli chcesz obserwować monady w ich „naturalnym środowisku”, powinieneś sprawdzić Haskell. Jedyną różnicą jest to, że Haskellerowie mówią: „Tylko >> = to gówno!”
Landei
Dzięki za link do artykułu, uznałam go za bardzo przydatny. Wróciłem również do rozdziału "For expressions revisited" w Programming in Scala, który rzuca trochę światła na pętle i ich użycie filtra, mapy, flatMap i flatten.
Guillaume Belrose,
10
Runar Bjarnason to osoba, której szukasz pochodzenia.
Uświadomienie sobie, dlaczego jest tak potężny, może przyjść z czasem, jeśli mam być szczery. Klasa Option to najlepsze miejsce, w którym można zacząć, aby zobaczyć, w jaki sposób można wielokrotnie spłaszczać serię odnośników (na przykład) do wyniku końcowego.
for
wyrażenia w odwołaniu do języka. Może to dać kilka wskazówek.Odpowiedzi:
Powodem tego wyrażenia jest to, że możesz zastąpić wiele żmudnego kodu if / then / else, który napiszesz, wywołaniami flatMap (i innych funkcji wyższego rzędu).
Jest to szczególnie ważne w przypadku opcji (patrz http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )
Ale dotyczy to też innych monad (chociaż muszę przyznać, że nie rozumiem jeszcze szczegółów)
Wyobraź sobie sytuację, w której masz kolekcję, do której chcesz zastosować funkcję (lub serię funkcji), w której każda funkcja może zwrócić wartość null. Kiedy faktycznie używasz null, twój kod będzie podziurawiony zerowymi kontrolami. Ale jeśli użyjesz opcji zamiast wartości, możesz po prostu zmapować wartości z pożądanymi funkcjami, łącząc funkcje w łańcuch w przypadku wielu funkcji i uzyskać kolekcję z wynikami, które nie są zerowe, co w wielu przypadkach jest dokładnie tym, co chcesz.
Ponieważ ten opis jest dość zawiły, krótsza rada „tylko płaska mapa tego gówna” przyjęła się.
źródło
Słyszałem historię, że dwóch wybitnych programistów Scala łączyło się w pary, gdy jeden z nich zaczął pisać taki kod:
W którym momencie drugi powiedział: „Co to jest? Amatorska godzina? Płaska mapa to gówno!”
A jeśli chodzi o to, co jest tak potężne
flatMap
, cóż ... Po pierwsze, jest to podstawowy operator monadyczny. Oznacza to, że jest to wspólna operacja współdzielona na przykład przez kontenery (takie jakOption
kolekcje itp.), Kontynuacje, stan itp. Po drugie, podczas gdy można zdekonstruować operacjęOption
, która w przeciwieństwie doflatMap
operacji nie jest operacją monadyczną , więc nie może być tak szeroko stosowany. Wymaga również zbyt dużej wiedzy na temat danych, którymi manipulujesz.Uwaga: wcześniej powiedziałem, że dopasowywanie jest wolniejsze niż
flatMap
- prawdę mówiąc jest odwrotnie, aż do najnowszej wersji Scali w momencie pisania tego tekstu, 2.10.1.)źródło
val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)
. Mogę dodać więcej monad, usunąć monady i pozostaje bez zmian. Zauważ też, że nie rozkłada się naString
, ale naOption[String]
. Chociaż w rzeczywistości w ogóle się nie rozkłada. Jednym z powodów, dla których niektórzy ludzie nie lubią używać kontenerów jako przykładów dla monad, jest to, że możesz wyjmować rzeczy z kontenerów, ale nie wszystkie monady na to pozwalają.Najważniejsze
flatMap
jest to, że jest to reprezentacja operacji wiązania monadycznego w Scali. W sieci jest wiele samouczków wyjaśniających cel monad i dlaczego są one tak przydatne; James Iry ma taki, który zawiera pewne szczegóły.źródło
Option
to tylko jeden z wieluflatMap
przypadków użycia. Oczywiście, jeśli chcesz obserwować monady w ich „naturalnym środowisku”, powinieneś sprawdzić Haskell. Jedyną różnicą jest to, że Haskellerowie mówią: „Tylko >> = to gówno!”Runar Bjarnason to osoba, której szukasz pochodzenia.
Uświadomienie sobie, dlaczego jest tak potężny, może przyjść z czasem, jeśli mam być szczery. Klasa Option to najlepsze miejsce, w którym można zacząć, aby zobaczyć, w jaki sposób można wielokrotnie spłaszczać serię odnośników (na przykład) do wyniku końcowego.
źródło