12

これらが機能する理由

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 }
4

2 に答える 2

13

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つだけに特別な構文を提供することであり、非常に頻繁な場合であり、それ以外の場合は言語を統一することです。

于 2012-04-18T10:25:13.540 に答える
4

@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...

于 2012-04-18T11:05:12.903 に答える