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! _ =
это трюк, который я часто использую для улучшения вывода типов.