2017-11-16 3 views
3

は、私がこれを持って言う:letキーワードなしで計算式でbindを呼び出す方法はありますか?

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

は(上bindメソッドを呼び出して)その場で住所や名前を「アンラップ」する方法はありますか?次のような並べ替えがあります。

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

(!がオンザフライで展開されていない場合) bindの結果を1回だけ使用するたびに新しい変数を宣言しなければならないことは少し冗長に思えます。

答えて

4

BindおよびReturnの方法は、MyComputationExpressionで利用できます。これは、計算式は言語機能として存在する理由である、非常に醜いコード、ある

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

:あなたの元のコードは、この同等のコードに変換されます。あなたが望むようにインラインで使用できることは、現在不可能です。追加の言語機能となり、it has been suggested beforeとなります。

2

特定の例では、容易にインライン化するために、オペレータから呼び出すことができる。より複雑なケースで

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

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

、明示的計算の残りにbindを実行する必要性は、少なくとも可読性を向上させることができます。

関連する問題