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
,这至少可以提高可读性