2009-11-25 2 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 # Version 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, чтобы вы могли закончить свой блок tracerreturn x, что было бы более традиционным?

+0

Нет причин, чтобы не делать какие-либо из этих вещей - это всего лишь несколько примеров кода я играл вокруг, и я не мог понять, что ошибка пыталась мне рассказать. Я отправил это сообщение в fsbugs, мы посмотрим, что они скажут. –

 Смежные вопросы

  • Нет связанных вопросов^_^