【发布时间】:2016-06-03 21:56:59
【问题描述】:
F# 计算表达式的语法如下:
ident { cexpr }
其中ident 是构建器对象(此语法取自Don Syme's 2007 blog entry)。
在我见过的所有示例中,构建器对象都是单例实例,并且是无状态启动的。 Don 给出了定义一个名为 attempt 的构建器对象的示例:
let attempt = new AttemptBuilder()
我的问题: 为什么 F# 不直接在计算表达式中使用 AttemptBuilder 类?当然,这种表示法可以像实例方法调用一样简单地用于静态方法调用。
使用实例值意味着理论上可以实例化同一类的多个构建器对象,可能以某种方式参数化,甚至(天堂禁止)具有可变的内部状态。但我无法想象这会有什么用处。
更新:我上面引用的语法表明构建器必须显示为单个标识符,这具有误导性,并且可能反映了该语言的早期版本。最新的F# 2.0 Language Specification 将语法定义为:
expr { comp-or-range-expr }
这清楚地表明任何表达式(计算结果为构建器对象)都可以用作构造的第一个元素。
【问题讨论】:
-
参数化计算表达式示例:github.com/mausch/fsharpx/blob/…