首页 > 解决方案 > 实现让!... 和!...在自定义计算表达式中

问题描述

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

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

    return x + y
  }

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

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

标签: f#computation-expression

解决方案


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

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是创建一个由编译器自动去元组的结果元组。您可能还会发现此示例此 SO 问题很有用。


推荐阅读