贬低理解

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 理解可以应用于实现去糖表示所需方法的任何类型。这些方法的返回类型没有限制,只要它们是可组合的。