Wie Sie in Ein Rundgang durch Scala: Sequenz-Verständnis lesen können: "In Scala kann jeder Datentyp, der die Operationen filter, map und flatMap (mit den richtigen Typen) unterstützt, in Sequenz-Verständnissen verwendet werden." Tatsächlich bedeutet dies, dass Sie es wie ein Monad behandeln können.
Und flatMap für einen Monad hat eine Signatur wie diese:
def flatMap(f: A => M[B]): M[B]
Alle Sammlungen in Scala haben monadische Schnittstellen, sodass Sie monadische Operationen in diesem engen Rahmen als Operationen auf Sequenzen betrachten können. Aber das ist nicht die ganze Geschichte. Im Fall einiger Monaden ist es verwirrender als hilfreich, sie als Sammlungen zu betrachten. Im Allgemeinen wendet flatMap eine Transformation des "Inhalts" eines Mondes an, indem dieser Mond mit einer Operation komponiert wird, die in einer anderen Mondinstanz desselben Typs resultiert. Daher können Sie Monaden auf mindestens zwei Arten betrachten:
- Monad ist eine Art Sammlung (oder Box, die etwas hält) und die Elemente dieser Sammlung sind der "Inhalt".
- Monad ist eine Art Kontext und die Elemente des Monads sind einfach einige Berechnungen, die in diesem Kontext durchgeführt werden.
Manchmal ist es einfacher, über eine Monade als eine Sammlung nachzudenken, manchmal ist es einfacher, sie als Kontext zu betrachten. Zumindest für mich. Tatsächlich sind beide Ansätze austauschbar, d.h. Sie können Listen (Sammlungen) als nichtdeterministische Berechnungen betrachten, die eine beliebige Anzahl von Ergebnissen zurückgeben können.
Also im Fall von Try könnte es einfacher sein, darüber als Ausführungskontext nachzudenken, mit zwei Zuständen, Erfolg und Misserfolg. Wenn Sie mehrere Versuche komponieren möchten und einer von ihnen sich im Misserfolgszustand befindet, wird der gesamte Kontext zum Misserfolg (die Kette wird unterbrochen). Andernfalls können Sie einige Operationen am "Inhalt" dieser Versuche durchführen und der Kontext ist erfolgreich.