Scala Language Monadico per le comprensioni


Esempio

Se hai diversi oggetti di tipi monadici , possiamo ottenere combinazioni dei valori usando un 'per comprensione':

for {
   x <- Option(1)
   y <- Option("b")
   z <- List(3, 4)
} {
    // Now we can use the x, y, z variables
    println(x, y, z)
    x  // the last expression is *not* the output of the block in this case!
}

// This prints
// (1, "b", 3)
// (1, "b", 4)

Il tipo di ritorno di questo blocco è Unit .

Se gli oggetti sono dello stesso tipo monadico M (es. Option ), allora usando yield restituirà un oggetto di tipo M invece di Unit .

val a = for {
   x <- Option(1)
   y <- Option("b")
} yield {
    // Now we can use the x, y variables
    println(x, y)
    // whatever is at the end of the block is the output
    (7 * x, y)
}

// This prints:
// (1, "b")
// The val `a` is set:
// a: Option[(Int, String)] = Some((7,b))

Si noti che la parola chiave yield non può essere utilizzata nell'esempio originale, dove esiste un mix di tipi monadici ( Option ed List ). Provare a farlo produrrà un errore di mancata corrispondenza di tipo in fase di compilazione.