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

时间:2012-12-04 19:46:14

标签: f# monads maybe computation-expression

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

例如,我有一个带有多个嵌套if / thens的函数,即只要数据在整个过程中通过某些“测试”,函数就应该继续。

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

3 个答案:

答案 0 :(得分:5)

你可以在不定义新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 ()
} 

答案 1 :(得分:4)

我提供了一个条件工作流程来回应a similar problem。我会在这里复制一下,供参考。

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
  }

正如您在previous answer的评论中所看到的,并非所有人都是粉丝。但它仍然很有趣。

答案 2 :(得分:3)

两个好的答案,Daniel和eirik。

Daniels的回答让我得到了一个我以前见过的解决方案,Tomas Petricek的implementation of an imperative workflow。我决定采用它,因为它提供了最好的可读性,并且在非布尔上下文中也很有用。

谢谢,所有。