F#计算表达式的语法如下:
ident { cexpr }
这里的ident
是生成器对象(这种语法来自Don Syme 2007年的博客文章)。
在我看过的所有示例中,生成器对象都是单例实例,并且本身是无状态的。Don提供了一个定义名为attempt
的生成器对象的示例:
let attempt = new AttemptBuilder()
我的问题:为什么 F# 不直接在计算表达式中使用 AttemptBuilder
类呢?毕竟,这种符号表示法可以像实例方法调用一样轻松地转换成静态方法调用。
使用实例值意味着理论上可以实例化多个相同类的构建器对象,假设以某种方式参数化,甚至(天哪)具有可变内部状态。但我想象不出这将如何有用。
更新:我引用的语法表明构建器必须显示为单个标识符,这是误导性的,可能反映了语言的早期版本。最新的F# 2.0 语言规范定义了以下语法:
expr { comp-or-range-expr }
这表明任何表达式(可评估为生成器对象)都可以用作结构的第一个元素。