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]