gpt4 book ai didi

f# - 为什么计算表达式不跨越finally block

转载 作者:行者123 更新时间:2023-12-01 17:32:20 25 4
gpt4 key购买 nike

例如:

let test () = 
async {
try
do! someting ()
finally
do! sometingElse ()
}

你不能执行do!,最后你从编译器得到消息“你只能在计算表达式中使用do!”,但它仍然在那里。

我知道如何解决这个问题,但我想了解为什么编译器限制这种情况。

好吧,经过一番摆弄后,我认为它是这样脱糖的:(我很高兴我们可以编写 cexprs)

来自:

async {
try
do! someting ()
do! sometingElse ()
finally
printfn "finally"
}

至:

async.TryFinally(
async.Bind(
someting(), (fun () ->
async.Bind(sometingElse (), (fun () ->
async.Zero())))), (fun () -> printfn "finally")) |> ignore

我了解到 TryFinally 的第二部分不支持 cexpr

最佳答案

正如问题中已经讨论的那样,根本不支持带有 finally 子句计算表达式的 try-finally 表达式(在 F# 3.1 中)。然而,实现本质上具有这种行为的函数很容易。这是一个示例实现:

let tryFinally (body: Async<'x>) (finalize: Async<unit>) : Async<'x> = async {
let! result = Async.Catch body
do! finalize
return match result with
| Choice1Of2 value -> value
| Choice2Of2 exn -> raise exn
}

关于f# - 为什么计算表达式不跨越finally block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25870194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com