Co jest takiego potężnego w płaskiej mapie, że zasługuje na takie miejsce w folklorze Scala?
for
wyrażenia w odwołaniu do języka. Może to dać kilka wskazówek.
Co jest takiego potężnego w płaskiej mapie, że zasługuje na takie miejsce w folklorze Scala?
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ę.
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 {
case Some ...
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 Option
kolekcje itp.), Kontynuacje, stan itp. Po drugie, podczas gdy można zdekonstruować operację Option
, która w przeciwieństwie do flatMap
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.)
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 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.
Option
to tylko jeden z wielu flatMap
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.