Lisez la section sur la façon dont le compilateur gère les forexpressions dans la référence du langage. Cela pourrait donner quelques indices.
Dirk
@tstenner: Tant que nous nous appuyons sur des mèmes laconiques: Google est votre ami.
Chuck
4
@aishwarya C'est plus comme "Utilisez simplement flatmap sur votre liste / tableau / option", pas "merde" comme dans "mauvais"
tstenner
1
En fait, cette phrase spécifique a été (bien sûr) sortie de son contexte, où quelqu'un a raté la monade Bar (Reader) quelque part à Manhattan ;-) Comme cela arrive dans de tels cas, la version courte est restée bloquée.
Roland Kuhn
Réponses:
55
Le raisonnement derrière cette phrase est que vous pouvez remplacer beaucoup de code fastidieux if / then / else que vous écririez par des appels à flatMap (et à d'autres fonctions d'ordre supérieur).
Mais cela s'applique également à d'autres monades (même si je dois l'admettre, je ne comprends pas encore exactement les détails moi-même)
Imaginez la situation où vous avez une collection pour laquelle vous souhaitez appliquer une fonction (ou une série de fonctions) où chaque fonction peut renvoyer null. Lorsque vous utilisez réellement null, votre code sera criblé de vérifications nulles. Mais si vous utilisez Options au lieu de valeurs, vous pouvez simplement mapper les valeurs avec les fonctions souhaitées, en chaînant les fonctions dans le cas de plusieurs fonctions et obtenir une collection avec uniquement les résultats qui ne sont pas nuls, ce qui dans de nombreux cas est exactement ce que tu veux.
Puisque cette description est plutôt alambiquée, le conseil plus court "juste une carte plate de cette merde" s'est établi.
Personnellement, j'utilise parfois la monade de liste pour traiter des combinaisons.
Dan Burton
103
L'histoire que j'ai entendue était que deux programmeurs Scala prééminents se jumelaient quand l'un d'eux a commencé à écrire du code comme celui-ci:
option match{caseSome...
A quel moment l'autre a dit "Qu'est-ce que c'est? Heure amateur? Carte plate cette merde!"
Quant à ce qui est si puissant flatMap, eh bien ... Premièrement, c'est l'opérateur monadique fondamental. Cela signifie qu'il s'agit d'une opération commune partagée, par exemple, par des conteneurs (tels que des Optioncollections, etc.), des continuations, un état, etc. Deuxièmement, même si vous pouvez déconstruire un Option, qui, par opposition à flatMap, n'est pas une opération monadique , donc il ne peut pas être aussi largement appliqué. En outre, cela nécessite trop de connaissances sur les données que vous manipulez.
Remarque: précédemment, j'ai dit que la correspondance était plus lente que flatMap- le contraire est vrai en fait, jusqu'à la version la plus récente de Scala au moment de la rédaction de cet article, 2.10.1.)
Je suppose que je suis encore à l'heure amateur alors :-)
Guillaume Belrose
69
Ces deux programmeurs étaient moi-même et Paul Chiusano.
Apocalisp
1
Si je me souviens bien, #legendofklang ne s'est-il pas manifesté sur Twitter à peu près au même moment ... ce qui est souvent à l'origine de la mauvaise attribution du flatmap that shit meme? Nous devrions créer une sorte d'entrée de wiki Scala meme; il y en a des géniaux maintenant!
timothy
3
@WillSargent Je pense qu'il manque la forêt pour les arbres. L'avantage est qu'il compose . Si j'ai une fonction qui dépend de quatre monades, je peux écrire val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d). Je peux ajouter plus de monades, supprimer des monades et cela reste le même. Notez également qu'il ne se décompose pas en String, mais en Option[String]. Bien qu'en fait, il ne se décompose pas du tout. L'une des raisons pour lesquelles certaines personnes n'aiment pas utiliser les conteneurs comme exemples de monades est que vous pouvez sortir des objets des conteneurs, mais toutes les monades ne vous permettent pas de le faire.
L'essentiel flatMapest qu'il s'agit de la représentation par Scala de l'opération de liaison monadique. Il existe de nombreux tutoriels sur le Web expliquant le but des monades et pourquoi exactement elles sont si utiles; James Iry en a un qui rentre dans les détails.
Je pense que c'est la bonne réponse, Optionc'est juste l'un des nombreux flatMapcas d'utilisation. Bien sûr, si vous voulez observer les monades dans leur «habitat naturel», vous devriez consulter Haskell. La seule différence est que les Haskellers disent: "Juste >> = cette merde!"
Landei
Merci pour le lien vers l'article, je l'ai trouvé très utile. Je suis aussi retourné au chapitre "For expressions revisited" de Programming in Scala qui éclaire un peu les boucles for et leur utilisation de filter, map, flatMap et flatten.
Guillaume Belrose
10
Runar Bjarnason est la personne que vous recherchez pour l'origine.
Réaliser pourquoi il est si puissant est quelque chose qui ne peut venir qu'avec le temps pour être honnête. La classe Option est le meilleur point de départ pour voir comment vous mettriez à plat à plusieurs reprises une série de recherches (par exemple) dans un résultat final.
for
expressions dans la référence du langage. Cela pourrait donner quelques indices.Réponses:
Le raisonnement derrière cette phrase est que vous pouvez remplacer beaucoup de code fastidieux if / then / else que vous écririez par des appels à flatMap (et à d'autres fonctions d'ordre supérieur).
Cela est particulièrement vrai pour les options (voir http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )
Mais cela s'applique également à d'autres monades (même si je dois l'admettre, je ne comprends pas encore exactement les détails moi-même)
Imaginez la situation où vous avez une collection pour laquelle vous souhaitez appliquer une fonction (ou une série de fonctions) où chaque fonction peut renvoyer null. Lorsque vous utilisez réellement null, votre code sera criblé de vérifications nulles. Mais si vous utilisez Options au lieu de valeurs, vous pouvez simplement mapper les valeurs avec les fonctions souhaitées, en chaînant les fonctions dans le cas de plusieurs fonctions et obtenir une collection avec uniquement les résultats qui ne sont pas nuls, ce qui dans de nombreux cas est exactement ce que tu veux.
Puisque cette description est plutôt alambiquée, le conseil plus court "juste une carte plate de cette merde" s'est établi.
la source
L'histoire que j'ai entendue était que deux programmeurs Scala prééminents se jumelaient quand l'un d'eux a commencé à écrire du code comme celui-ci:
A quel moment l'autre a dit "Qu'est-ce que c'est? Heure amateur? Carte plate cette merde!"
Quant à ce qui est si puissant
flatMap
, eh bien ... Premièrement, c'est l'opérateur monadique fondamental. Cela signifie qu'il s'agit d'une opération commune partagée, par exemple, par des conteneurs (tels que desOption
collections, etc.), des continuations, un état, etc. Deuxièmement, même si vous pouvez déconstruire unOption
, qui, par opposition àflatMap
, n'est pas une opération monadique , donc il ne peut pas être aussi largement appliqué. En outre, cela nécessite trop de connaissances sur les données que vous manipulez.Remarque: précédemment, j'ai dit que la correspondance était plus lente que
flatMap
- le contraire est vrai en fait, jusqu'à la version la plus récente de Scala au moment de la rédaction de cet article, 2.10.1.)la source
val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)
. Je peux ajouter plus de monades, supprimer des monades et cela reste le même. Notez également qu'il ne se décompose pas enString
, mais enOption[String]
. Bien qu'en fait, il ne se décompose pas du tout. L'une des raisons pour lesquelles certaines personnes n'aiment pas utiliser les conteneurs comme exemples de monades est que vous pouvez sortir des objets des conteneurs, mais toutes les monades ne vous permettent pas de le faire.L'essentiel
flatMap
est qu'il s'agit de la représentation par Scala de l'opération de liaison monadique. Il existe de nombreux tutoriels sur le Web expliquant le but des monades et pourquoi exactement elles sont si utiles; James Iry en a un qui rentre dans les détails.la source
Option
c'est juste l'un des nombreuxflatMap
cas d'utilisation. Bien sûr, si vous voulez observer les monades dans leur «habitat naturel», vous devriez consulter Haskell. La seule différence est que les Haskellers disent: "Juste >> = cette merde!"Runar Bjarnason est la personne que vous recherchez pour l'origine.
Réaliser pourquoi il est si puissant est quelque chose qui ne peut venir qu'avec le temps pour être honnête. La classe Option est le meilleur point de départ pour voir comment vous mettriez à plat à plusieurs reprises une série de recherches (par exemple) dans un résultat final.
la source