Почему для выражений вычислений F # требуется объект-строитель (а не класс)?

Выражения вычисления F # имеют синтаксис:

ident { cexpr }

кудаident является объектом-строителем (этот синтаксис взят изЗапись в блоге Дона Сайма за 2007 год).

Во всех примерах, которые я видел, объекты компоновщика являются одноэлементными экземплярами и не загружаются без сохранения состояния. Дон приводит пример определения объекта-строителя под названиемattempt:

let attempt = new AttemptBuilder()

My question: Почему 'F # просто не используетAttemptBuilder Класс непосредственно в выражениях вычислений? Конечно, нотация может быть обезврежена к вызовам статических методов так же легко, как вызовы метода экземпляра.

Использование значения экземпляра означает, что теоретически можно создать несколько объектов-строителей одного и того же класса, предположительно параметризованным каким-либо образом, или даже (не дай бог) с изменяемым внутренним состоянием. Но я не могу себе представить, как это было бы полезно.

Update: Синтаксис, который я цитировал выше, предполагает, что сборщик должен отображаться в виде единого идентификатора, который вводит в заблуждение и, вероятно, отражает более раннюю версию языка. Самый последнийСпецификация языка F # 2.0 определяет синтаксис как:

expr { comp-or-range-expr }

что дает понять, что любое выражение (которое оценивается как объект компоновщика) может использоваться в качестве первого элемента конструкции.

Ответы на вопрос(3)

Ваш ответ на вопрос