2016-03-26 12 views
2

に組み合わせる:私は方法戻りゼロの目的はを組み合わせて理解し、私が何であるかを理解していないゼロと私は次の計算式ビルダ持っている計算式

type ExprBuilder() = 
    member this.Return(x) = 
     Some x 

let expr = new ExprBuilder() 

を以下に示す式の相違点:

let a = expr{ 
    printfn "Hello" 
    return 1 
} // result is Some 1 

let c = expr{ 
    return 1 
    printfn "Hello" 
} // do not compile. Combine method required 

また、なぜ最初のケースであるのかわからないゼロのメソッドは不要ですprintfnステートメント?

答えて

4

最初の式では、値が1になる計算が実行されます。 Zeroreturnのために必要なだけなので、は必要ありません。なぜなら、それは何も存在しないときには何もありません)、そして式にreturnがあります。

具体的に質問に答えるには、式内のすべての行が変換されるわけではないので、Zeroは「for printfn文」のようには必要ありません。計算式をコンパイルするとき、コンパイラはlet!,do!returnなどの「特別な」ポイントでそれらを分割し、それらのポイントの間の残りのコードはすべてそのまま残します。この場合、printfnコールは、returnの前に実行されるコードの一部になります。値1における最初の結果、及びZeroにおける第1の結果(式がreturnを欠いている場合、暗黙的に想定される)第二の発現において

、あなたは計算を行います。しかし、計算式全体で2つの戻り値を持つことはできません。したがって、2つの計算結果をまとめて(と組み合わせると)、Combineメソッドが必要です。

CombineZeroのほかに、Delayを実装する必要があります。ビルダーが評価を延期し、可能であればCombine実装内のいくつかの部分を落とすことを可能にするために、マルチパート(すなわち、「結合」)計算もDelayにラップされる。

this introductionによって、Scott Wlaschin(具体的にはpart 3 about Delay and Run)からお伝えすることをお勧めします。