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



我想我已经对 F# monads(工作流)有了足够的了解,以至于我在代码中看到了一些实现它们是有意义的地方。

例如,我有一个具有多个嵌套 if/then 的函数,即该函数只有在数据通过某些"测试"的情况下才应继续。

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

您可以在不定义新 monad 的情况下完成此操作。只需定义

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

您现在可以与maybe一起使用:

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

我提供了一个条件的工作流程来回应类似的问题。我将它复制到此处以供参考。

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
  }

正如您在我之前回答的评论中看到的那样,并非每个人都是粉丝。但这仍然很有趣。

两个很好的答案,丹尼尔和埃里克。

Daniels的回答让我想到了一个我以前实际见过的解决方案,Tomas Petricek对imperative工作流程的实现。 我决定这样做,因为它提供了最佳的可读性,并且在非布尔上下文中也很有用。

谢谢大家。

最新更新