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.