Sto leggendo "Programming in Scala 2nd Edition" e ho qualche idea su Monad di un corso Haskell che ho seguito. Comunque, io non capisco perché il seguente codice "magicamente" funziona:Come si traduce un'espressione con più monadi tradotte in scala?
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)
Non capisco quanto sopra perché secondo del libro Capitolo 23.4, l'espressione for
è tradotto in qualcosa di simile:
b flatMap (y =>
a map (x => x)
)
Sono perplesso perché il codice sopra compila perché y => a map (x => x)
è di tipo Int => Option[Int]
, mentre lo b.flatMap
prevede uno Int => List[Something]
.
D'altra parte, il seguente codice non viene compilato (che è un bene altrimenti sarei più perso):
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;
^
Allora, qual è magico con il primo esempio?
'Option' non è un' GenTraversableOnce' –
Esiste una conversione implicita denominata option2Iterable definita in oggetto Option, che può convertire Option in Iterable. – Eastsun
@LuigiPlinge: Sì, lo è. Ho aggiornato la risposta per spiegare come funziona. – ruakh