我认为我对 F# monads(工作流)有足够的了解,我在我的代码中看到了一些地方实现它们是有意义的。
例如,我有一个具有多个嵌套 if/then 的函数,即只要数据一路通过某些“测试”,该函数就应该继续。
我熟悉“可能”单子,但在我见过的所有示例中,它都被编码为对let!
绑定进行操作,而我没有这样做。我希望有人可以为我提供一个为嵌套布尔测试而不是let
绑定量身定制的“可能”工作流程示例。
我认为我对 F# monads(工作流)有足够的了解,我在我的代码中看到了一些地方实现它们是有意义的。
例如,我有一个具有多个嵌套 if/then 的函数,即只要数据一路通过某些“测试”,该函数就应该继续。
我熟悉“可能”单子,但在我见过的所有示例中,它都被编码为对let!
绑定进行操作,而我没有这样做。我希望有人可以为我提供一个为嵌套布尔测试而不是let
绑定量身定制的“可能”工作流程示例。
您可以在不定义新单子的情况下完成此操作。只需定义
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
。我决定这样做,因为它提供了最好的可读性并且在非布尔上下文中也很有用。
谢谢大家。