贬低理解
Scala 中的 for
理解只是语法糖 。这些理解是使用其主题类型的 withFilter
,foreach
,flatMap
和 map
方法实现的。因此,只有定义了这些方法的类型才能在 for
理解中使用。
以下形式的 for
理解,模式 pN
,发电机 gN
和条件 cN
:
for(p0 <- x0 if g0; p1 <- g1 if c1) { ??? }
…将使用 withFilter
和 foreach
去除嵌套调用:
g0.withFilter({ case p0 => c0 case _ => false }).foreach({
case p0 => g1.withFilter({ case p1 => c1 case _ => false }).foreach({
case p1 => ???
})
})
而以下形式的 for
/ yield
表达式:
for(p0 <- g0 if c0; p1 <- g1 if c1) yield ???
…将使用 withFilter
和 flatMap
或 map
去除嵌套呼叫:
g0.withFilter({ case p0 => c0 case _ => false }).flatMap({
case p0 => g1.withFilter({ case p1 => c1 case _ => false }).map({
case p1 => ???
})
})
(注意,map
用于最内层的理解,并且 flatMap
用于每个外部理解。)
for
理解可以应用于实现去糖表示所需方法的任何类型。这些方法的返回类型没有限制,只要它们是可组合的。