次のコードをコンパイルしようとすると、エラーが発生することに気付きました。
let xx =
seq {
let! i = [ 1; 2 ]
let! j = [ 3; 4 ]
yield (i,j)
}
これが与えるエラーは、「error FS0795: The use of 'let! x = coll' in sequence Expressions is no longer allowed. Use 'for x in coll' instead.」です。このメッセージはもちろん明確で、修正方法を示しています。固定コードは次のようになります。
let xx =
seq {
for i in [ 1; 2 ] do
for j in [ 3; 4 ] do
yield (i,j)
}
私の質問は、これを修正する方法ではなく、なぜ「させてください!」そもそもシーケンス式で許可されていませんか? 私はどのようにすることができるという事実を見ることができます!式を繰り返し処理することに驚く人もいるかもしれませんが、それだけでこの構造が許可されないわけではありません。また、"let!" を含むバージョンのように、ここでは "for" がより強力であることがわかります。「シーケンス式の最後まで」として反復の範囲で焼き付けます。
ただし、コードをインデントせずにシーケンスを反復できることは、まさに私が探していたものでした (ツリー構造をトラバースするため)。このセマンティックを取得するには、「seq」式ビルダーとほとんど同じように機能する新しい式ビルダーを作成する必要があると思いますが、「let!」を許可します。反復のためですね。
以下のブライアンのコメントに基づいて追加され、私の根本的な問題の解決策を提供します。
forブロックのインデントが不要であることを認識していませんでした。2 番目のサンプルは次のように書き直すことができます。
let xx =
seq {
for i in [ 1; 2 ] do
for j in [ 3; 4 ] do
yield (i,j)
}
...ツリー構造をトラバースするときに増え続けるインデントを取り除きます。この構文では、次のように、追加のインデントを必要とせずにforステートメントの間に追加のステートメントを使用することもできます。
let yy =
seq {
for i in [ 1; 2 ] do
let i42 = i+42
for j in [ 3; 4 ] do
yield (i42,j)
}
さて、これらのステートメントにインデントが必要だと思った理由を理解できれば...