Почему для выражений вычислений F # требуется объект-строитель (а не класс)?
Выражения вычисления F # имеют синтаксис:
ident { cexpr }
кудаident
является объектом-строителем (этот синтаксис взят изЗапись в блоге Дона Сайма за 2007 год).
Во всех примерах, которые я видел, объекты компоновщика являются одноэлементными экземплярами и не загружаются без сохранения состояния. Дон приводит пример определения объекта-строителя под названиемattempt
:
let attempt = new AttemptBuilder()
My question: Почему 'F # просто не используетAttemptBuilder
Класс непосредственно в выражениях вычислений? Конечно, нотация может быть обезврежена к вызовам статических методов так же легко, как вызовы метода экземпляра.
Использование значения экземпляра означает, что теоретически можно создать несколько объектов-строителей одного и того же класса, предположительно параметризованным каким-либо образом, или даже (не дай бог) с изменяемым внутренним состоянием. Но я не могу себе представить, как это было бы полезно.
Update: Синтаксис, который я цитировал выше, предполагает, что сборщик должен отображаться в виде единого идентификатора, который вводит в заблуждение и, вероятно, отражает более раннюю версию языка. Самый последнийСпецификация языка F # 2.0 определяет синтаксис как:
expr { comp-or-range-expr }
что дает понять, что любое выражение (которое оценивается как объект компоновщика) может использоваться в качестве первого элемента конструкции.