Warum erfordern F # -Berechnungsausdrücke ein Builder-Objekt (und keine Klasse)?

F # -Berechnungsausdrücke haben die Syntax:

ident { cexpr }

Woherident ist das Builder-Objekt (diese Syntax stammt vonDon Syme 2007 Blogeintrag).

In allen Beispielen, die ich gesehen habe, sind Builder-Objekte Singleton-Instanzen und zum Booten statuslos. Don gibt das Beispiel für die Definition eines Builder-Objekts mit dem Namenattempt:

let attempt = new AttemptBuilder()

Meine Frage: Warum benutzt F # nicht einfach dasAttemptBuilder Klasse direkt in Rechenausdrücken? Sicherlich könnte die Notation genauso einfach zu statischen Methodenaufrufen entzuckert werden wie Instanzmethodenaufrufe.

Die Verwendung eines Instanzwerts bedeutet, dass man theoretisch mehrere Builder-Objekte derselben Klasse instanziieren kann, die vermutlich auf irgendeine Weise parametrisiert sind, oder sogar (der Himmel verbietet) mit einem veränderlichen internen Zustand. Aber ich kann mir nicht vorstellen, wie das jemals nützlich sein würde.

Aktualisieren: Die oben angegebene Syntax legt nahe, dass der Builder als einzelne Kennung angezeigt werden muss. Dies ist irreführend und spiegelt wahrscheinlich eine frühere Version der Sprache wider. Der neuestenF # 2.0-Sprachspezifikation definiert die Syntax als:

expr { comp-or-range-expr }

Dies macht deutlich, dass jeder Ausdruck (der zu einem Builder-Objekt ausgewertet wird) als erstes Element des Konstrukts verwendet werden kann.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage