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' メソッドを定義している場合にのみ使用できます

奇妙な警告のように思えます: もしそれが正しければ、コードは動作しないはずです。ビルダーが 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.10ReturnFromでは、指定されていない場合の合成については何も言及されていません。member x.ReturnFrom v = vビルダーに a を付けない理由はありますか? または 、ブロックをでmember x.Return(v) = Success v終了できるようにするには、どちらがより伝統的でしょうか?tracerreturn x

于 2009-11-26T02:05:21.350 に答える