Skąd się wzięło idiomatyczne wyrażenie „flatmap that s ***” w Scali?

104

Co jest takiego potężnego w płaskiej mapie, że zasługuje na takie miejsce w folklorze Scala?

Guillaume Belrose
źródło
30
[potrzebne źródło]
tstenner
1
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).

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ę.

Jens Schauder
źródło
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 {
    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 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.)

Daniel C. Sobral
źródło
4
Chyba nadal jestem na amatorskiej godzinie :-)
Guillaume Belrose
69
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ą.
Daniel C. Sobral,
1
Można zobaczyć link do dyskusji cytowany tutaj: web.archive.org/web/20130627111326/http://beust.com/weblog/2010/...
Hawkeye
12

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.

Submonoid
źródło
4
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.

Sean Parsons
źródło