Почему это вычислительное выражение F # выдает предупреждение? - PullRequest
3 голосов
/ 26 ноября 2009

Этот код:

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 ]

6 голосов
/ 02 декабря 2009

Я отправил вопрос по адресу fsbugs@microsoft.com, и это ошибка. Они сказали, что это будет ошибка в следующем выпуске.

(Они ответили почти сразу, на День Благодарения не меньше - мне просто понадобилось время, чтобы разместить информацию здесь.)

4 голосов
/ 26 ноября 2009

Я удивлен, что это работает. В разделе 6.10 спецификации ничего не говорится о синтезе ReturnFrom, если он не указан. Есть ли причина не просто ставить member x.ReturnFrom v = v на застройщика? Или member x.Return(v) = Success v, чтобы вы могли завершить свой tracer блок return x, что было бы более традиционным?

...