Scalaは,1つ以上のジェネレータ(一般に,2つ以上の<-記号)を使ったfor内包表記を表現する事ができます。この場合,利用可能な2つの方法があります。
// 誤り!
for (x <- board.rows; y <- board.files)
yield (x, y)
// 正しい!
for {
x <- board.rows
y <- board.files
} yield (x, y)
後者のスタイルはより冗長ですが,一般には読みやすく,より「スケーラブル」である(内包が複雑になってわかりにくくなる事が無い,という意味で)と言えます。2つ以上のジェネレータを含むfor内包表記は,全てこのフォームで書くべきです。ジェネレータを1つだけ持つ内包表記(e.g. for(i <- 0 to 10) yield i)は,最初のフォーム(波括弧ではなく括弧)を用いるべきです。
このルールに対する例外は,yield節の無いfor内包表記です。この場合,
// 誤り!
for {
x <- board.rows
y <- board.files
} {
printf("(%d, %d)", x, y)
}
// 正しい!
for (x <- board.rows; y <- board.files) {
printf("(%d, %d)", x, y)
}
結果として,for内包表記はその可読性の高さ(これはfor内包表記を拡張した理由の1つです)からmap,flatMap,そしてfilterの連鎖呼び出しよりも好ましいと言えます。