如何在没有let关键字的情况下对计算表达式调用bind?

时间:2017-11-16 14:17:42

标签: f# computation-expression

说我有这个:

MyComputationExpression {
    let! addr = Salesrecord.Address
    let! name = Salesrecord.Name
    return (name + " " + addr)
}

有没有办法在运行中“解包”(在bind方法上调用)地址和名称?有点像:

MyComputationExpression {
    (Salesrecord.Name! + " " + Salesrecord.Address!)
}

(如果!是动态解包的操作员)。每次我只想使用bind的结果时,必须声明一个新变量似乎有点冗长。

2 个答案:

答案 0 :(得分:4)

Bind上提供了

ReturnMyComputationExpression方法。您的原始代码将转换为此等效代码:

MyComputationExpression.Bind(
    Salesrecord.Address,
    fun addr -> MyComputationExpression.Bind(
        Salesrecord.Name,
        fun name -> async.Return (name + " " + addr)))

这是非常难看的代码,这就是计算表达式作为语言特性存在的原因。能够以您想要的方式内联使用它们目前是不可能的。这将是一个额外的语言功能it has been suggested before

答案 1 :(得分:2)

您可以从操作员轻松调用您的具体示例,以便进行内联:

let inline (+?) a b =
    MyComputationExpression(){
        let! x = a
        let! y = b
        return x + y }

Some 3 +? None
salesrecord.Address +? Some " " +? salesrecord.Name

在更复杂的情况下,需要明确地对计算的其余部分执行bind,这至少可以提高可读性。