Cosa c'è di così potente in flatmap da meritare un posto del genere nel folclore scaligero?
for
espressioni nel riferimento al linguaggio. Potrebbe dare qualche suggerimento.
Cosa c'è di così potente in flatmap da meritare un posto del genere nel folclore scaligero?
for
espressioni nel riferimento al linguaggio. Potrebbe dare qualche suggerimento.
Risposte:
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.
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.)
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.
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.
Option
è solo uno dei tanti flatMap
casi 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!"
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.