如何在没有 let 关键字的情况下对计算表达式调用绑定?
How can I call bind on a computation expression without the let keyword?
假设我有这个:
MyComputationExpression {
let! addr = Salesrecord.Address
let! name = Salesrecord.Name
return (name + " " + addr)
}
有什么方法可以即时 "unwrap"(调用 bind
方法)地址和姓名吗?有点像:
MyComputationExpression {
(Salesrecord.Name! + " " + Salesrecord.Address!)
}
(如果 ! 是动态展开的运算符)。每次我想只使用一次 bind
的结果时都必须声明一个新变量似乎有点冗长。
Bind
和 Return
方法在 MyComputationExpression
上可用。您的原始代码已转换为以下等效代码:
MyComputationExpression.Bind(
Salesrecord.Address,
fun addr -> MyComputationExpression.Bind(
Salesrecord.Name,
fun name -> async.Return (name + " " + addr)))
这是一段非常难看的代码,这就是计算表达式作为一种语言特性存在的原因。目前无法以您想要的方式内联使用它们。这将是一个额外的语言功能和 it has been suggested before.
您的具体示例可以很容易地从运算符中调用,以便内联:
let inline (+?) a b =
MyComputationExpression(){
let! x = a
let! y = b
return x + y }
Some 3 +? None
salesrecord.Address +? Some " " +? salesrecord.Name
在更复杂的情况下,需要显式执行 bind
计算的其余部分可能至少会提高可读性。
假设我有这个:
MyComputationExpression {
let! addr = Salesrecord.Address
let! name = Salesrecord.Name
return (name + " " + addr)
}
有什么方法可以即时 "unwrap"(调用 bind
方法)地址和姓名吗?有点像:
MyComputationExpression {
(Salesrecord.Name! + " " + Salesrecord.Address!)
}
(如果 ! 是动态展开的运算符)。每次我想只使用一次 bind
的结果时都必须声明一个新变量似乎有点冗长。
Bind
和 Return
方法在 MyComputationExpression
上可用。您的原始代码已转换为以下等效代码:
MyComputationExpression.Bind(
Salesrecord.Address,
fun addr -> MyComputationExpression.Bind(
Salesrecord.Name,
fun name -> async.Return (name + " " + addr)))
这是一段非常难看的代码,这就是计算表达式作为一种语言特性存在的原因。目前无法以您想要的方式内联使用它们。这将是一个额外的语言功能和 it has been suggested before.
您的具体示例可以很容易地从运算符中调用,以便内联:
let inline (+?) a b =
MyComputationExpression(){
let! x = a
let! y = b
return x + y }
Some 3 +? None
salesrecord.Address +? Some " " +? salesrecord.Name
在更复杂的情况下,需要显式执行 bind
计算的其余部分可能至少会提高可读性。