为什么这个F#计算表达式会发出警告?

时间:2009-11-25 23:37:22

标签: f# computation-expression

此代码:

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”方法时才能使用此控件构造

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

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

2 个答案:

答案 0 :(得分:6)

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

(他们几乎立即回应,感恩节也不少 - 我只花了一段时间把信息放在这里。)

答案 1 :(得分:4)

我很惊讶这是有效的。 Section 6.10 of the spec没有提及在未指定时合成ReturnFrom的任何内容。有没有理由不在构建器上放置member x.ReturnFrom v = v?或者member x.Return(v) = Success v,以便您可以使用tracer结束return x阻止,这会更传统吗?