3

这段代码:

type Result = Success of string

type Tracer() =
  member x.Bind(p: Result, rest: (string -> Result)) = 
    match p with
    | Success s -> rest s

let tracer = new Tracer()

let t = tracer {
  let! x = Success "yes!"
  let! y = Success "waste of time"
  return! Success x
}

printfn "%A" t

打印成功“是!”

但是给出一个警告,暗示它不应该工作:

File1.fs(19,3):警告 FS0708:仅当计算表达式构建器定义了“ReturnFrom”方法时,才可以使用此控制构造

似乎是一个奇怪的警告:如果它是正确的,那么代码不应该工作。真的只是说builder必须合成ReturnFrom吗?

(F# 版本 1.9.7.4,为 .NET Framework 版本 v4.0.21006 编译)

4

2 回答 2

6

我将问题发送到 fsbugs@microsoft.com,这是一个错误。他们说这将是下一个版本的错误。

(他们几乎立即做出了回应,感恩节同样如此——我花了一段时间才把信息放在这里。)

于 2009-12-02T06:06:04.870 回答
4

我很惊讶这行得通。 规范的第 6.10 节没有提到任何关于ReturnFrom未指定时的合成。是否有理由不只是member x.ReturnFrom v = v在构建器上放置一个?或者member x.Return(v) = Success v, 这样你就可以用 来结束你的tracerreturn x,哪个更传统?

于 2009-11-26T02:05:21.350 回答