F# FSharpPlus:当我尝试组合两个变压器时,fsi会阻塞

F# FSharpPlus:当我尝试组合两个变压器时,fsi会阻塞,f#,monads,monad-transformers,fsi,f#+,F#,Monads,Monad Transformers,Fsi,F#+,当我尝试组合这两个变压器时,fsi会阻塞,没有任何警告或错误消息 open FSharpPlus open FSharpPlus.Data type MyError = | Err of string let f : WriterT<ResultT<Async<Result<_, MyError>>>> = monad { do! liftAsync <| Async.Sleep 30 do! tell ["abc"]

当我尝试组合这两个变压器时,fsi会阻塞,没有任何警告或错误消息

open FSharpPlus
open FSharpPlus.Data

type MyError = | Err of string

let f : WriterT<ResultT<Async<Result<_, MyError>>>> = monad {
    do! liftAsync <| Async.Sleep 30
    do! tell ["abc"]
    let! r0 = lift<| ResultT.hoist (Ok 25)
    return r0 + 5
    }

let g = monad {
    let! r1 = f
    do! tell ["def"]
    do! liftAsync <| Async.Sleep 50
    let! r2 = lift<| ResultT.hoist (Ok 2)
    return r1 + r2
    }

let runStackT stack = stack |> WriterT.run |> ResultT.run |> Async.RunSynchronously

#time "on"
let finalResult = runStackT g
#time "off"
打开FSharpPlus
打开FSharpPlus.Data
类型MyError=|字符串的错误
设f:WriterT=monad{

do!liftAsync如评论中所述,这是一个F#bug

您的代码是正确的,即使它不是正确的,也没有理由让F#编译器挂起

如果您更改以下行,我找到了一个解决方法:

...
let g: WriterT<ResultT<Async<Result<_, MyError>>>> = monad {
    let! r1 = f
    let! _ = tell ["def"]
    let! _ = liftAsync <| Async.Sleep 50
    let! r2 = WriterT.Lift <| ResultT.hoist (Ok 2)
    ...
。。。
设g:WriterT=monad{
设!r1=f
让我告诉你

let!\uu=liftAsync有趣。你的代码对我来说似乎是正确的,即使它不是fsi也不应该冻结,因此这看起来像是一个F#bug。我建议在FSharpPlus中打开一个问题,尝试最小化它,最终解决它并将其报告给F#编译器项目。它仍然不起作用。始终是同一个问题。你运行了脚本吗?是的,它工作了ks。虽然由于3层单子推理,编译需要花费一点时间。我在片段中添加了一行缺失的代码,该代码保持原样,但我不确定这是否会让您感到困惑(可能不会)。运行脚本后,您应该会收到一条关于F#泛型实例化的警告,这不会阻止代码编译和运行。