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