4

F#モナド(ワークフロー)について十分に理解しているので、コード内でそれらを実装することが理にかなっている場所がいくつかあります。

たとえば、複数のネストされたif / thenを持つ関数があります。つまり、関数は、データが途中で特定の「テスト」に合格する限り継続する必要があります。

私は「たぶん」モナドに精通していますが、私が見たすべての例では、let!バインディングを操作するようにコード化されていますが、これは私が行っていません。letバインドではなく、ネストされたブール型テスト用に調整された「多分」ワークフローの例を誰かが提供してくれることを期待しています。

4

3 に答える 3

6

新しいモナドを定義せずにこれをやってのけることができます。定義するだけ

let test b = if b then Some () else None

これで使用できるようになりましたmaybe

maybe {
    do! test (1 > 0)
    printfn "1"
    do! test (2 > 3)
    printfn "2"

    return ()
} 
于 2012-12-04T20:57:42.150 に答える
5

同様の問題に対応して、条件付きワークフローを提供しました。参考までに、ここにコピーします。

module Condition =
  type ConditionBuilder() =
    member x.Bind(v, f) = if v then f() else false
    member x.Return(v) = v
  let condition = ConditionBuilder()

open Condition

let eval() =
  condition {
    // do some work
    do! conditionA
    // do some work
    do! conditionB
    // do some work
    do! conditionC
    return true
  }

私の以前の回答へのコメントでわかるように、誰もがファンではありません。しかし、それでも興味深いです。

于 2012-12-04T19:56:12.167 に答える
4

ダニエルとエイリックの両方の良い答え。

ダニエルズの答えは、私が以前に実際に見た解決策、トマーシュペトリッチのワークフローの実装にimperative私を導きました。読みやすさが最高で、ブール値以外のコンテキストでも役立つため、これを使用することにしました。

皆さんありがとう。

于 2012-12-04T22:31:32.523 に答える