嵌套布尔测试的F#计算表达式?

Mil*_*oDC 3 monads f# computation-expression maybe

我认为我已经对F#monads(工作流)有了足够的了解,我在代码中看到了一些实现它们的地方.

例如,我有一个具有多个嵌套if/thens的函数,即只要数据通过某些"测试",函数就应该继续.

我熟悉"也许"monad,但在我看过的所有例子中,它都被编码为对let!绑定进行操作,我没有这样做.我希望有人可以为我提供一个为嵌套布尔测试量身定制的"可能"工作流程的示例,而不是let绑定.

Dan*_*iel 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
  }
Run Code Online (Sandbox Code Playgroud)

正如您在我之前回答的评论中所见,并非每个人都是粉丝。但它仍然很有趣。


eir*_*rik 5

你可以在没有定义新monad的情况下解决这个问题.只是定义

let test b = if b then Some () else None
Run Code Online (Sandbox Code Playgroud)

您现在可以使用maybe:

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

    return ()
} 
Run Code Online (Sandbox Code Playgroud)