3

说我有这个:

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

有没有办法bind即时“解包”(调用方法)地址和名称?有点像:

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

(如果 ! 是动态展开的运算符)。每次我想使用bind一次的结果时都必须声明一个新变量似乎有点冗长。

4

2 回答 2

4

BindReturn方法可用MyComputationExpression。您的原始代码将转换为此等效代码:

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

这是相当难看的代码,这就是为什么计算表达式作为语言特性存在的原因。目前不可能以您想要的方式内联使用它们。这将是一个额外的语言功能,之前已经建议过

于 2017-11-16T15:20:45.257 回答
2

您的具体示例可以很容易地从操作员调用,以便内联:

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

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

在更复杂的情况下,需要显式地执行bind剩余的计算至少可以提高可读性。

于 2017-11-16T19:38:04.573 回答