2009-11-25 82 views
3

此代碼:這個F#計算表達式爲什麼會給出警告?

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)

回答

6

我把問題發送到[email protected],這是一個錯誤。他們表示這將是下一個版本的錯誤。

(他們回答幾乎是立刻,在感恩節沒少 - 它只是花了一段時間把這裏的信息。)

4

我很驚訝,這個工程。 Section 6.10 of the spec在未指定時未提及有關合成ReturnFrom的任何內容。有沒有理由不把member x.ReturnFrom v = v放在建造者身上?或member x.Return(v) = Success v,以便您可以結束您的tracer塊與return x,這將更傳統?

+0

沒有理由不去做那些事 - 這只是一些示例代碼,我被打在附近,我無法理解錯誤是想告訴我什麼。 我把這封郵件寄給fsbugs,我們會看到他們要說的。 – 2009-11-26 18:12:54

相關問題