Dlaczego wyrażenia obliczeniowe F # wymagają obiektu budującego (a nie klasy)?

Wyrażenia obliczeniowe F # mają składnię:

ident { cexpr }

Gdzieident jest obiektem konstruktora (z tej składni pochodziWpis na blogu Don Syme z 2007 roku).

We wszystkich przykładach, które widziałem, obiekty konstruktora są pojedynczymi instancjami, a bezstanowe do uruchamiania. Don podaje przykład definiowania obiektu budującego o nazwieattempt:

let attempt = new AttemptBuilder()

Moje pytanie: Dlaczego F # po prostu nie używaAttemptBuilder klasa bezpośrednio w wyrażeniach obliczeniowych? Z pewnością notacja może być odwzorowana na wywołania metod statycznych równie łatwo, jak wywołania metody instancji.

Użycie wartości instancji oznacza, że ​​teoretycznie można utworzyć instancję wielu obiektów budowniczych tej samej klasy, przypuszczalnie sparametryzowanych w jakiś sposób, a nawet (zakazać nieba) ze zmiennym stanem wewnętrznym. Ale nie wyobrażam sobie, jak to byłoby przydatne.

Aktualizacja: Cytowana powyżej składnia sugeruje, że program budujący musi występować jako pojedynczy identyfikator, co jest mylące i prawdopodobnie odzwierciedla wcześniejszą wersję języka. OstatnieSpecyfikacja języka F # 2.0 definiuje składnię jako:

expr { comp-or-range-expr }

co wyjaśnia, że ​​każde wyrażenie (które ocenia obiekt konstruktora) może być użyte jako pierwszy element konstruktu.

questionAnswers(3)

yourAnswerToTheQuestion