FSharpPlus: блоки fsi, когда я пытаюсь объединить два трансформатора

Когда я пытаюсь объединить эти два трансформатора, 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"

В чем проблема и как заставить этот код работать?

1 ответ

Как сказано в комментариях, это ошибка F#.

Ваш код правильный, и даже если это не так, нет причин, по которым компилятор 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)
    ...

это сработает.

Обратите внимание, что изменение do! для let! _ = это трюк, который я часто использую для улучшения вывода типов.

Другие вопросы по тегам