F# Puzzle

問題

次のコードで何が出力されるでしょうか? 軽量構文を使ってます!

[
  for x in [ 1; 2; ] do
  for y in [ 10; 20; ] do
    yield x + y
  for z in [ 100; 200; ] do
    yield z
]

解答

> [
-   for x in [ 1; 2; ] do
-   for y in [ 10; 20; ] do
-     yield x + y
-   for z in [ 100; 200; ] do
-     yield z
- ];;
val it : int list = [11; 21; 100; 200; 12; 22; 100; 200]

合ってましたか? [11; 21; 12; 22; 100; 200]が出力されると思った人はいませんでしたか?私です!

先ほどのコードは次コードと同じです。

[
  for x in [ 1; 2; ] do
    for y in [ 10; 20; ] do
      yield x + y
    for z in [ 100; 200; ] do
      yield z
]

[11; 21; 12; 22; 100; 200]と出力されるように書きたければ、次のように書きます。

> [
-   for x in [ 1; 2; ] do
-     for y in [ 10; 20; ] do
-       yield x + y
-   for z in [ 100; 200; ] do
-     yield z
- ];;
val it : int list = [11; 21; 12; 22; 100; 200]

forをインデントを変えずに続けて2つ書いた場合、2つめのfor以降が、1つめのforのブロックとして扱われます。

シーケンス式に限らず、for式はこの挙動です。

> let values = ResizeArray()
- do
-   for x in [ 1; 2; ] do
-   for y in [ 10; 20; ] do
-     values.Add(x + y)
-   for z in [ 100; 200; ] do
-     values.Add(z)
- Seq.toList values;;

val values : System.Collections.Generic.List<int>
val it : int list = [11; 21; 100; 200; 12; 22; 100; 200]