I offered up a conditional workflow in response to a similar problem. I'll copy it here, for reference.
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
}
As you can see in the comments to my previous answer, not everyone's a fan. But it's interesting nonetheless.