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

sdg*_*sdh 5 f# computation-expression

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

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

    return x + y
  }
Run Code Online (Sandbox Code Playgroud)

编译器说我必须实现Bind2or MergeSource但是,我在文档中找不到它们。

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

bri*_*rns 3

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

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
Run Code Online (Sandbox Code Playgroud)

的目的MergeSources是创建一个由编译器自动解元组的结果元组。您可能还会发现这个例子这个问题很有用。