2

計算式がどのように機能するかについてさらに学習するために、ステートメントのthenブロックを評価した後に式の残りをスキップするビルダーをコーディングしようとしています。これにより、ワークフロー自体が. どのステートメントも に評価されない場合、ワークフローは返されます。iftruefalseiftrue

例えば:

let mutable x = 0

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

ここでは、 でresultある必要がありtrue、 でxある必要があります33

私が得た最も近いものは次のとおりです。

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

...これにより、ワークフローがfalse、およびxに評価されます11

これは、私の例の構文を使用して実行できますか?

4

2 に答える 2

3

探している動作を実現するための最小の変更は、おそらく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。計算ビルダーはあなたのものと同じですが、追加Returnのメンバーが次を返しtrueます:

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つで述べたように、これは、命令型スタイルとbreak と continue を備えた拡張バージョンを使用できる私の命令型計算ビルダーに多少関連しています。return

于 2016-07-13T15:42:20.380 に答える