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

4
我认为我已经足够理解F#单子(工作流),我在我的代码中看到了一些实现它们有意义的地方。
例如,我有一个带有多个嵌套if/then的函数,即只有当数据沿途通过某些“测试”时,该函数才应继续运行。
我熟悉“maybe”单子,但在我看过的所有示例中,它都是编码为操作let!绑定的,而我并没有这样做。 我希望有人能为我提供一个针对嵌套布尔测试而非let绑定的“maybe”工作流示例。
3个回答

6
你可以不必定义一个新的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 ()
} 

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
  }

正如您在我以前的回答的评论中所看到的,不是每个人都喜欢它。但它仍然很有趣。


非常有趣,正如你所说,它有助于演示 F# 的惊人能力。感谢您的帖子! - Serge Belov

4

两个回答都很好,Daniel和eirik。

Daniel的回答让我想到了一个解决方案,我之前曾经看过Tomas Petricek的imperative工作流实现。我决定采用这种方法,因为它提供了最佳可读性,并且在非布尔上下文中也很有用。

谢谢大家。


1
如果您对选项的一般概述感兴趣,可以参考以下链接,其中介绍了一些有用的模式:http://www.cl.cam.ac.uk/~tp322/drafts/notations.pdf。大多数示例都在此处实现:http://www.tryjoinads.org/computations。我也需要将其转化为博客文章系列 :-) - Tomas Petricek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接