实施让! ... 和! ...在自定义计算表达式中

Implementing let! ... and! ... in a custom Computation Expression

我想为此构造添加对我的计算表达式构建器的支持:

let f = 
  foo {
    let! x =
      foo {
        return 1
      }
    and! y =
      foo {
        return 2
      }

    return x + y
  }

编译器说我必须实现 Bind2MergeSource。但是,我在 the docs.

中找不到它们

这些应该有什么签名?能举个简单的例子吗?

这是一个适用于您的示例的简单构建器:

type Foo<'t> = MkFoo of 't

type FooBuilder() =
    member _.Bind(MkFoo x, f) = f x
    member _.Return(x) = MkFoo x
    member _.MergeSources(MkFoo x, MkFoo y) = MkFoo (x, y)

let foo = FooBuilder()

let f =
    foo {
        let! x = foo { return 1 }
        and! y = foo { return 2 }
        return x + y
    }
printfn "%A" f   // output: MkFoo 3

MergeSources 的目的是创建一个结果元组,该元组将由编译器自动解元组。您可能还会发现 this example and 有用。