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 类型(Option
和 List
)。尝试这样做会产生编译时类型不匹配错误。