これらが機能する理由
let x = seq { for i in 1 .. 10 do yield i }
let x = seq { for i in 1 .. 10 -> i }
let x = seq { for i = 1 to 10 do yield i }
しかし、これはそうではありませんか?
let x = seq { for i = 1 to 10 -> i }
F#仕様によれば、シーケンス式は通常の計算式(これはあなたが書く場合ですdo yield
)またはシーケンス式に固有の短い形式のいずれかです。
seq { comp-expr }
seq { short-comp-expr }
ケースはあなたのcomp-expr
最初と最後の実用的な例をカバーしています。短い形式は使用->
し、仕様では、許可されている短い形式は次のin
キーワードのみであると明示的に示されています。
short-comp-expr :=
for pat in expr-or-range-expr -> expr -- yield result
実際に役立つ短い形式は他にもたくさんありますが、目的は、この1つだけに特別な構文を提供することであり、非常に頻繁な場合であり、それ以外の場合は言語を統一することです。
@Tomasの回答にさらに詳細を追加するために、最初と3番目の例を次のように詳しく説明します。
let x = Seq.collect (fun i -> {yield i}) {1..10}
2番目の例は次のように翻訳されます。
let x = Seq.map (fun i -> i) {1..10}
変換規則は、仕様のセクション6.3.11に記載されています。for
このセクションでは、F#が完全なループ(for...in...do
およびfor...to...do
)を均一に処理していることもわかりますが、withの特別な構文はブロックにのみ->
適用されます。for...in...
for...in...
いつでも表現できるので問題ありませんfor...to...
。