Lesen Sie den Abschnitt darüber, wie der Compiler mit forAusdrücken in der Sprachreferenz umgeht. Es könnte einige Hinweise geben.
Dirk
@tstenner: Solange wir uns auf knappe Meme stützen: Google ist dein Freund.
Chuck
4
@aishwarya Es ist eher wie "Verwenden Sie einfach Flatmap auf Ihrer Liste / Array / Option", nicht "Scheiße" wie in "schlecht"
tstenner
1
Eigentlich wurde dieser spezielle Satz (natürlich) aus dem Zusammenhang gerissen, als jemand irgendwo in Manhattan die Bar (Reader) -Monade verpasste ;-) Wie es in solchen Fällen passiert, blieb die Kurzversion hängen.
Roland Kuhn
Antworten:
55
Der Grund für diesen Satz ist, dass Sie viel langwierigen if / then / else-Code, den Sie schreiben würden, durch Aufrufe von flatMap (und anderen Funktionen höherer Ordnung) ersetzen können.
Aber es gilt auch für andere Monaden (obwohl ich zugeben muss, verstehe ich die Details selbst noch nicht genau)
Stellen Sie sich die Situation vor, in der Sie eine Sammlung haben, für die Sie eine Funktion (oder eine Reihe von Funktionen) anwenden möchten, bei der jede Funktion möglicherweise null zurückgibt. Wenn Sie tatsächlich null verwenden, wird Ihr Code mit Nullprüfungen durchsetzt. Wenn Sie jedoch Optionen anstelle von Werten verwenden, können Sie die Werte einfach mit den gewünschten Funktionen flach zuordnen, die Funktionen bei mehreren Funktionen verketten und eine Sammlung mit nur den Ergebnissen erhalten, die nicht null sind, was in vielen Fällen genau das ist Sie wollen.
Da diese Beschreibung ziemlich kompliziert ist, hat sich der kürzere Rat "nur Flatmap, die Scheiße" etabliert.
Ich persönlich benutze die Listenmonade manchmal, um mit Kombinationen umzugehen.
Dan Burton
103
Die Geschichte, die ich hörte, war, dass sich zwei herausragende Scala-Programmierer paarten, als einer von ihnen anfing, Code wie diesen zu schreiben:
option match{caseSome...
An welchem Punkt sagte der andere: "Was ist das? Amateurstunde? Flache Karte, die Scheiße!"
Was das Mächtige flatMapbetrifft, na ja ... Erstens ist es der grundlegende monadische Operator. Dies bedeutet, dass es sich um eine allgemeine Operation handelt, die beispielsweise von Containern (z. B. OptionSammlungen usw.), Fortsetzungen, Status usw. gemeinsam genutzt wird. Zweitens können Sie eine dekonstruieren Option, die im Gegensatz zu flatMapkeine monadische Operation ist , so kann es nicht so weit verbreitet sein. Außerdem ist zu viel Wissen über die Daten erforderlich, die Sie bearbeiten.
Hinweis: Früher habe ich gesagt, dass der Abgleich langsamer ist als flatMap- das Gegenteil ist tatsächlich der Fall, bis zur neuesten Version von Scala zum Zeitpunkt dieses Schreibens, 2.10.1.)
Diese beiden Programmierer waren ich und Paul Chiusano.
Apocalisp
1
Wenn ich mich richtig erinnere, manifestierte sich #legendofklang nicht ungefähr zur gleichen Zeit auf Twitter ... was ist oft die Wurzel der Fehlzuschreibung der Flatmap, die Meme scheiße? Wir sollten eine Art Scala-Meme-Wiki-Eintrag machen; es gibt jetzt einige tolle!
Timothy
3
@ WillSargent Ich denke, das fehlt der Wald vor lauter Bäumen. Der Vorteil ist, dass es komponiert . Wenn ich eine Funktion habe, die von vier Monaden abhängt, kann ich schreiben val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d). Ich kann weitere Monaden hinzufügen, Monaden entfernen und es bleibt gleich. Beachten Sie auch, dass es sich nicht in String, sondern in zerlegt Option[String]. Tatsächlich zersetzt es sich jedoch überhaupt nicht. Einer der Gründe, warum manche Leute Container nicht gerne als Beispiele für Monaden verwenden, ist, dass Sie Dinge aus Containern herausnehmen können, aber nicht alle Monaden lassen Sie das zu.
Das Entscheidende dabei flatMapist, dass Scala die monadische Bindungsoperation darstellt. Es gibt zahlreiche Tutorials im Internet, die den Zweck von Monaden erklären und erklären, warum genau sie so nützlich sind. James Iry hat eine, die ins Detail geht.
Ich denke, dies ist die richtige Antwort, Optionist nur einer von vielen flatMapAnwendungsfällen. Wenn Sie Monaden in ihrem "natürlichen Lebensraum" beobachten möchten, sollten Sie sich natürlich Haskell ansehen. Der einzige Unterschied ist, dass Haskellers sagen: "Nur >> = diese Scheiße!"
Landei
Vielen Dank für den Link zum Artikel, ich fand ihn sehr nützlich. Ich ging auch zurück zum Kapitel "Für Ausdrücke überarbeitet" in der Programmierung in Scala, in dem die Schleifen und ihre Verwendung von Filter, Map, FlatMap und Flatten beleuchtet werden.
Guillaume Belrose
10
Runar Bjarnason ist die Person, nach der Sie suchen.
Zu erkennen, warum es so mächtig ist, kann nur mit der Zeit kommen, um ehrlich zu sein. Die Option-Klasse ist der beste Ausgangspunkt, um zu sehen, wie Sie wiederholt eine Reihe von Suchvorgängen (z. B.) in ein Endergebnis umwandeln würden.
for
Ausdrücken in der Sprachreferenz umgeht. Es könnte einige Hinweise geben.Antworten:
Der Grund für diesen Satz ist, dass Sie viel langwierigen if / then / else-Code, den Sie schreiben würden, durch Aufrufe von flatMap (und anderen Funktionen höherer Ordnung) ersetzen können.
Dies gilt insbesondere für Optionen (siehe http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ ).
Aber es gilt auch für andere Monaden (obwohl ich zugeben muss, verstehe ich die Details selbst noch nicht genau)
Stellen Sie sich die Situation vor, in der Sie eine Sammlung haben, für die Sie eine Funktion (oder eine Reihe von Funktionen) anwenden möchten, bei der jede Funktion möglicherweise null zurückgibt. Wenn Sie tatsächlich null verwenden, wird Ihr Code mit Nullprüfungen durchsetzt. Wenn Sie jedoch Optionen anstelle von Werten verwenden, können Sie die Werte einfach mit den gewünschten Funktionen flach zuordnen, die Funktionen bei mehreren Funktionen verketten und eine Sammlung mit nur den Ergebnissen erhalten, die nicht null sind, was in vielen Fällen genau das ist Sie wollen.
Da diese Beschreibung ziemlich kompliziert ist, hat sich der kürzere Rat "nur Flatmap, die Scheiße" etabliert.
quelle
Die Geschichte, die ich hörte, war, dass sich zwei herausragende Scala-Programmierer paarten, als einer von ihnen anfing, Code wie diesen zu schreiben:
An welchem Punkt sagte der andere: "Was ist das? Amateurstunde? Flache Karte, die Scheiße!"
Was das Mächtige
flatMap
betrifft, na ja ... Erstens ist es der grundlegende monadische Operator. Dies bedeutet, dass es sich um eine allgemeine Operation handelt, die beispielsweise von Containern (z. B.Option
Sammlungen usw.), Fortsetzungen, Status usw. gemeinsam genutzt wird. Zweitens können Sie eine dekonstruierenOption
, die im Gegensatz zuflatMap
keine monadische Operation ist , so kann es nicht so weit verbreitet sein. Außerdem ist zu viel Wissen über die Daten erforderlich, die Sie bearbeiten.Hinweis: Früher habe ich gesagt, dass der Abgleich langsamer ist als
flatMap
- das Gegenteil ist tatsächlich der Fall, bis zur neuesten Version von Scala zum Zeitpunkt dieses Schreibens, 2.10.1.)quelle
val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)
. Ich kann weitere Monaden hinzufügen, Monaden entfernen und es bleibt gleich. Beachten Sie auch, dass es sich nicht inString
, sondern in zerlegtOption[String]
. Tatsächlich zersetzt es sich jedoch überhaupt nicht. Einer der Gründe, warum manche Leute Container nicht gerne als Beispiele für Monaden verwenden, ist, dass Sie Dinge aus Containern herausnehmen können, aber nicht alle Monaden lassen Sie das zu.Das Entscheidende dabei
flatMap
ist, dass Scala die monadische Bindungsoperation darstellt. Es gibt zahlreiche Tutorials im Internet, die den Zweck von Monaden erklären und erklären, warum genau sie so nützlich sind. James Iry hat eine, die ins Detail geht.quelle
Option
ist nur einer von vielenflatMap
Anwendungsfällen. Wenn Sie Monaden in ihrem "natürlichen Lebensraum" beobachten möchten, sollten Sie sich natürlich Haskell ansehen. Der einzige Unterschied ist, dass Haskellers sagen: "Nur >> = diese Scheiße!"Runar Bjarnason ist die Person, nach der Sie suchen.
Zu erkennen, warum es so mächtig ist, kann nur mit der Zeit kommen, um ehrlich zu sein. Die Option-Klasse ist der beste Ausgangspunkt, um zu sehen, wie Sie wiederholt eine Reihe von Suchvorgängen (z. B.) in ein Endergebnis umwandeln würden.
quelle