Monadic 的理解

如果你有幾個 monadic 型別的物件,我們可以使用’for comprehension’來實現值的組合:

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)

這個塊的返回型別是 Unit

如果物件具有相同的 monadic 型別 M(例如 Option),則使用 yield 將返回 M 型別的物件而不是 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))

請注意,yield 關鍵字不能用於原始示例中,其中混合使用 monadic 型別(OptionList)。嘗試這樣做會產生編譯時型別不匹配錯誤。