F#の計算式は、構文を持っている:F#計算式に(クラスではなく)ビルダーオブジェクトが必要なのはなぜですか?
ident
は、ビルダーオブジェクト(この構文は
Don Syme's 2007 blog entryから取られている)である
ident { cexpr }
。
私が見たすべての例では、ビルダーオブジェクトはシングルトンインスタンスであり、ステートレスで起動します。ドンはattempt
と呼ばれるビルダーオブジェクトを定義する例を示します:
let attempt = new AttemptBuilder()
私の質問:なぜF#は単なる計算式で直接AttemptBuilder
クラスを使用していませんか?確かに、この表記法は、インスタンスメソッド呼び出しと同じくらい簡単に静的メソッド呼び出しに取りかかることができます。
インスタンス値を使用するということは、理論的には同じクラスの複数のビルダーオブジェクトをインスタンス化することができることを意味します。おそらく何らかの方法でパラメータ化されています。しかし、それがどのように役立つだろうと私は想像することはできません。
アップデート:私は上に引用構文はビルダーが誤解を招くおそれがあり、おそらく言語の以前のバージョンを反映した単一の識別子として表示される必要があります示唆しています。それは明確な(ビルダーオブジェクトに評価される)任意の式は、構造体の最初の要素として用いることができることになり
expr { comp-or-range-expr }
:最新F# 2.0 Language Specificationは、などの構文を定義します。
例のようにそれを使用することができます。https: //github.com/mausch/fsharpx/blob/ec5f2de4c1c81aea8ef5e139b10c0cd0091ac2e5/src/FSharpx.Core/Monad.fs#L201 –