Ich lese "Programmierung in Scala 2nd Edition" und ich habe eine Idee über Monad von einem Haskell-Kurs, den ich nahm. Aber ich verstehe nicht, warum der folgende Code „magische Weise“ funktioniert:Wie wird ein Ausdruck mit mehreren Monaden in Scala übersetzt?
scala> val a: Option[Int] = Some(100)
a: Option[Int] = Some(100)
scala> val b = List(1, 2, 3)
b: List[Int] = List(1, 2, 3)
for (y <- b; x <- a) yield x;
res5: List[Int] = List(100, 100, 100)
Ich verstehe nicht, die oben, weil nach dem Kapitel des Buchs 23,4, der for
Ausdruck ist so etwas wie übersetzt:
b flatMap (y =>
a map (x => x)
)
Ich bin verwirrt, warum der obige Code kompiliert, weil y => a map (x => x)
vom Typ Int => Option[Int]
ist, während die eine Int => List[Something]
erwartet.
Auf der anderen Seite, der folgende Code kompiliert nicht (was ich wäre verloren gut anders ist):
scala> for (x <- a; y <- b) yield y;
<console>:10: error: type mismatch;
found : List[Int]
required: Option[?]
for (x <- a; y <- b) yield y;
^
Also, was mit dem ersten Beispiel ist magisch?
'Option' ist kein' GenTraversableOnce' –
Es gibt eine im Option -Objekt definierte implizite Konvertierung namens option2Iterable, die Option zu Iterable konvertieren kann. – Eastsun
@LuigiPlinge: Ja, ist es. Ich habe die Antwort aktualisiert, um zu erklären, wie das funktioniert. – ruakh