Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如果没有let关键字,如何对计算表达式调用bind?_F#_Computation Expression - Fatal编程技术网

F# 如果没有let关键字,如何对计算表达式调用bind?

F# 如果没有let关键字,如何对计算表达式调用bind?,f#,computation-expression,F#,Computation Expression,假设我有这个: MyComputationExpression { let! addr = Salesrecord.Address let! name = Salesrecord.Name return (name + " " + addr) } 是否有任何方法可以动态地“展开”(调用bind方法)地址和名称?有点像: MyComputationExpression { (Salesrecord.Name! + " " + Salesrecord.Address

假设我有这个:

MyComputationExpression {
    let! addr = Salesrecord.Address
    let! name = Salesrecord.Name
    return (name + " " + addr)
}
是否有任何方法可以动态地“展开”(调用
bind
方法)地址和名称?有点像:

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

(如果!是在飞行中展开的操作员)。每次我只想使用一次
bind
的结果,就必须声明一个新变量,这似乎有点冗长。

bind
Return
方法在
mycomputingexpression
上可用。您的原始代码将转换为此等效代码:

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

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

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

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

Some 3 +? None
salesrecord.Address +? Some " " +? salesrecord.Name
在更复杂的情况下,需要在计算的剩余部分显式执行
bind
,这至少可以提高可读性