2016-07-13 18 views
2

ifステートメントのthenブロックを評価した後に式の残りの部分をスキップするビルダーをコーディングしようとしています。ワークフロー自体がtrueと評価されます。 ifステートメントのいずれもがtrueに評価されない場合、ワークフローはfalseを返します。例えばF# "exit early"計算式?

ここ
let mutable x = 0 

let result = 
    earlyExit { 
     if false then x <- 99 
     if true then x <- 33 
     if true then x <- 11 
    } 

resulttrueであるべきであり、x33でなければなりません。 falseに評価ワークフロー、および11からxになり

type EarlyExitBuilder() = 
    member this.Combine (a, b) = a || b() 
    member this.Delay fn = fn 
    member this.Run fn = fn() 
    member this.Zero() = false 

...:

私が得ている最も近いです。

この例では、この例の構文を使用していますか?

+0

関連:http://stackoverflow.com/questions/13710700/f-computation-expression-for-nested-boolean-tests – bytebuster

答えて

2

あなたが探している動作を与える最小の変化は、計算にreturnを追加するために、おそらくある - return構築物が早期に評価trueを返して終了することができます:

let mutable x = 0 

let result = 
    earlyExit { 
     if false then return x <- 99 
     if true then return x <- 33 
     if true then return x <- 11 
    } 

これはtrueに評価をxの値は33になります。計算ビルダーがtrueを返す追加Returnメンバーで、あなたと同じである:

type EarlyExitBuilder() = 
    member this.Combine (a, b) = a || b() 
    member this.Delay fn = fn 
    member this.Run fn = fn() 
    member this.Zero() = false 
    member this.Return(()) = true 

参照の答えの1で述べたように、これはあなたが無条件スタイルreturnextended version with break and continueを使用することができます私のimperative computation builderに多少関係しています。

+0

優秀、ありがとう、トマス!あなたはいつもF#愛好家を育てるために来ています。 :) 私は解決策を実現することに近い*ことを知ってうれしいです。 – MiloDC

+1

@MiloDCそれは面白い質問でした:)計算式はいつも予期せぬ驚きを隠す(私にとっても!) –

3

私が提案している構文を使ってこれを行う良い方法はないと思います。計算式の内、

if c then e 

のようなものは

if c then 
    e 
    builder.Zero() 
else 
    builder.Zero() 

のようなものので、分岐が取られた差別化するコンテキストに方法はありませんにコンパイルを取得しようとしています。