Was ist an Flatmap so mächtig, dass es einen solchen Platz in der Scala-Folklore verdient?
for
Ausdrücken in der Sprachreferenz umgeht. Es könnte einige Hinweise geben.
Was ist an Flatmap so mächtig, dass es einen solchen Platz in der Scala-Folklore verdient?
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.
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 {
case Some ...
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 dekonstruieren Option
, die im Gegensatz zu flatMap
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.)
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 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.
Option
ist nur einer von vielen flatMap
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.