Zum Beispiel:Warum nicht ein Berechnungsausdruck Pannenblock des schließlich
let test() =
async {
try
do! someting()
finally
do! sometingElse()
}
Sie können die do!
in der schließlich nicht tun Sie die Nachricht von dem Compiler erhalten „Sie tun können in einem Berechnung Ausdruck "aber es ist immer noch drin richtig.
Ich weiß, wie ich das lösen kann, aber ich würde gerne verstehen, warum der Compiler dieses Szenario einschränkt.
Ok, nachdem einige fiddeling Ich denke, es so entzuckert ist: (Ich bin sehr glücklich, dass wir cexprs schreiben)
aus:
async {
try
do! someting()
do! sometingElse()
finally
printfn "finally"
}
zu:
async.TryFinally(
async.Bind(
someting(), (fun() ->
async.Bind(sometingElse(), (fun() ->
async.Zero())))), (fun() -> printfn "finally")) |> ignore
ich dass der zweite Teil der TryFinally
keine cexpr
unterstützt.
Um dieses Verhalten zu verstehen, sollten Sie versuchen, den Arbeitsablauf zu entziffern. Sie werden sehen, wie die daraus resultierende Reihe von Funktionsaufrufen dies unmöglich macht. – Daniel
@ Vesa.A.J.K: Ich behaupte nicht, dass es ein unmögliches Konzept ist, nur dass die Art und Weise, wie Arbeitsabläufe derzeit entschärft werden, es verhindert. – Daniel
@ Vesa.AJK Ich denke, es ist nicht so sehr ein Versehen als eine Entscheidung, die Implementierung zu vereinfachen, um das Produkt schneller aus der Tür zu bekommen – phoog