Da dove viene l'espressione idiomatica "flatmap che merda" in Scala?


104

Cosa c'è di così potente in flatmap da meritare un posto del genere nel folclore scaligero?


30
[citazione necessaria]
tstenner

1
Leggere la sezione su come il compilatore gestisce le forespressioni nel riferimento al linguaggio. Potrebbe dare qualche suggerimento.
Dirk

@tstenner: Finché ci appoggiamo a meme concisi: Google è tuo amico.
Chuck

4
@aishwarya È più come "Usa flatmap sul tuo elenco / array / opzione", non "merda" come in "cattivo"
tstenner

1
In realtà, quella specifica frase è stata (ovviamente) estrapolata dal contesto, dove qualcuno ha perso la monade Bar (Reader) da qualche parte a Manhattan ;-) Come accade in questi casi, la versione breve è rimasta bloccata.
Roland Kuhn

Risposte:


55

Il ragionamento alla base di questa frase è che puoi sostituire un sacco di noioso codice if / then / else che scriveresti con chiamate a flatMap (e altre funzioni di ordine superiore).

Ciò è particolarmente vero per le Opzioni (vedi http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )

Ma si applica anche ad altre monadi (anche se devo ammettere che io stesso non capisco esattamente i dettagli)

Immagina la situazione in cui hai una raccolta per la quale desideri applicare una funzione (o una serie di funzioni) in cui ogni funzione potrebbe restituire null. Quando si utilizza effettivamente null, il codice sarà pieno di controlli null. Ma se usi Opzioni invece dei valori, puoi semplicemente mappare i valori con le funzioni desiderate, concatenare le funzioni nel caso di più funzioni e ottenere una raccolta con solo i risultati che non sono nulli, che in molti casi è esattamente ciò che tu vuoi.

Dal momento che quella descrizione è piuttosto contorta, il consiglio più breve "basta mappa piatta quella merda" si è affermato.


A volte uso la lista monade per gestire le combinazioni.
Dan Burton,

103

La storia che ho sentito è che due eminenti programmatori Scala si stavano accoppiando quando uno di loro ha iniziato a scrivere un codice come questo:

option match {
    case Some ...

A quel punto l'altro ha detto "Cos'è questo? Ora amatoriale? Mappa piatta quella merda!"

Quanto a cosa c'è di così potente flatMap, beh ... Primo, è l'operatore monadico fondamentale. Ciò significa che è un'operazione comune condiviso da, ad esempio, i contenitori (ad esempio Option, collezioni, ecc), continuazioni, stato, ecc In secondo luogo, mentre si può de-costruire una Option, che, al contrario di flatMap, non è un'operazione monadica , quindi non può essere applicato così ampiamente. Inoltre, richiede troppa conoscenza dei dati che stai manipolando.

Nota: in precedenza ho detto che la corrispondenza era più lenta di flatMap- in effetti è vero il contrario, fino alla versione più recente di Scala al momento in cui scrivo, 2.10.1.)


4
Immagino di essere ancora all'ora amatoriale allora :-)
Guillaume Belrose

69
Quei due programmatori eravamo io e Paul Chiusano.
Apocalisp

1
Se ricordo bene, #legendofklang non si è manifestato su Twitter più o meno nello stesso periodo ... che spesso è la radice della mancata attribuzione della flatmap a quel meme di merda? Dovremmo creare una sorta di voce wiki sui meme di Scala; ce ne sono di fantastici adesso!
timothy

3
@ WillSargent Penso che manchi la foresta per gli alberi. Il vantaggio è che compone . Se ho una funzione che dipende da quattro monadi, posso scrivere val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d). Posso aggiungere più monadi, rimuovere monadi e rimane lo stesso. Inoltre, nota che non si decompone in String, ma in Option[String]. Tuttavia, in realtà, non si decompone affatto. Uno dei motivi per cui ad alcune persone non piace usare i contenitori come esempi per le monadi è che puoi estrarre le cose dai contenitori, ma non tutte le monadi ti permettono di farlo.
Daniel C. Sobral

1
Puoi vedere un link alla discussione citata qui: web.archive.org/web/20130627111326/http://beust.com/weblog/2010/…
hawkeye

12

La cosa cruciale flatMapè che è la rappresentazione di Scala dell'operazione di bind monadico. Ci sono numerosi tutorial sul web che spiegano lo scopo delle monadi e perché esattamente sono così utili; James Iry ne ha uno che va nei dettagli.


4
Penso che questa sia la risposta corretta, Optionè solo uno dei tanti flatMapcasi d'uso. Ovviamente, se vuoi osservare le monadi nel loro "habitat naturale", dovresti dare un'occhiata a Haskell. L'unica differenza è che Haskeller dice: "Solo >> = quella merda!"
Landei

Grazie per il link all'articolo, l'ho trovato molto utile. Sono anche tornato al capitolo "Per le espressioni rivisitate" in Programmazione in Scala, che fa luce sui cicli for e sul loro uso di filtro, mappa, flatMap e appiattimento.
Guillaume Belrose

10

Runar Bjarnason è la persona che stai cercando per l'origine.

Capire perché è così potente è qualcosa che può arrivare solo con il tempo per essere onesti. La classe Option è il punto migliore da cui iniziare per vedere come si eseguirà ripetutamente la mappatura flatMappata di una serie di ricerche (ad esempio) in un risultato finale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.