F# 计算表达式具有以下语法:
ident { cexpr }
builder 对象在哪里ident
(此语法取自Don Syme 的 2007 年博客条目)。
在我见过的所有示例中,构建器对象都是单例实例,并且是无状态启动的。Don 给出了定义一个名为 builder 对象的示例attempt
:
let attempt = new AttemptBuilder()
我的问题:为什么 F# 不AttemptBuilder
直接在计算表达式中使用该类?当然,这种表示法可以像实例方法调用一样容易地用于静态方法调用。
使用实例值意味着理论上可以实例化同一类的多个构建器对象,可能以某种方式参数化,甚至(天堂禁止)具有可变的内部状态。但我无法想象这将如何有用。
更新:我上面引用的语法表明构建器必须显示为单个标识符,这具有误导性,并且可能反映了该语言的早期版本。最新的F# 2.0 语言规范将语法定义为:
expr { comp-or-range-expr }
这清楚地表明,任何表达式(计算结果为构建器对象)都可以用作构造的第一个元素。