F#の計算式の構文は次のとおりです。
ident { cexpr }
ident
ビルダーオブジェクトはどこにありますか(この構文はDon Symeの2007年のブログエントリから取得されています)。
私が見たすべての例で、ビルダーオブジェクトはシングルトンインスタンスであり、起動するためにステートレスです。Donは、次のようなビルダーオブジェクトを定義する例を示していますattempt
。
let attempt = new AttemptBuilder()
私の質問:AttemptBuilder
F#が計算式でクラスを直接使用しないのはなぜですか?確かに、この表記は、インスタンスメソッド呼び出しと同じくらい簡単に静的メソッド呼び出しに糖分を取り除くことができます。
インスタンス値を使用するということは、理論的には、同じクラスの複数のビルダーオブジェクトをインスタンス化できることを意味します。おそらく、何らかの方法でパラメーター化されているか、可変の内部状態でさえ(天国では禁止されています)。しかし、それがどのように役立つか想像できません。
更新:上記で引用した構文は、ビルダーが単一の識別子として表示される必要があることを示唆しています。これは誤解を招きやすく、おそらく以前のバージョンの言語を反映しています。最新のF#2.0言語仕様では、構文を次のように定義しています。
expr { comp-or-range-expr }
これにより、(ビルダーオブジェクトに評価される)任意の式を構成の最初の要素として使用できることが明確になります。