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