Asynchronous 如何在F中使用Async和AsyncResult#

Asynchronous 如何在F中使用Async和AsyncResult#,asynchronous,f#,Asynchronous,F#,使用FsToolkit.ErrorHandling库,让我们举一个例子: let doStuff = result { let! x = doSomething "hello" let! y = doAnotherthing "world" let z = combineTwo x y return z } 现在,我有一个名为combinedTwoAsync的combine

使用FsToolkit.ErrorHandling库,让我们举一个例子:

let doStuff =
    result {
        let! x = doSomething "hello"
        let! y = doAnotherthing "world"
        let  z = combineTwo x y
        return z
    }
现在,我有一个名为combinedTwoAsync的combinedTwo的异步版本:

let doStuff =
    result {
        let! x = doSomething "hello"
        let! y = doAnotherthing "world"
        let  z = combineTwoAsync x y |> Async.AwaitTask |> Async.RunSynchronously
        return z
    }
但是我看到它们有一个asyncResult表达式,它返回一个异步类型

但是,我不能这样做:

let doStuff =
    asyncResult {
        let! x = doSomething "hello"
        let! y = doAnotherthing "world"
        let! z = combineTwoAsync x y
        return z
    }
因为doSomethingAsync只是一个不返回结果对象的异步函数

我猜这是为了所有异步函数都将返回一个异步类型而设计的,但我正试图弄清楚如何在结果计算表达式中使用异步调用(对外部libs的调用)来返回一个异步类型

希望这有一定的意义:)

一般来说,对于函子(其中
async
是其中之一),可以使用
map
对函子的值应用某种类型的转换,例如将其包装在
结果中。例如,Ok

//xAsyncResult:Async
让xAsyncResult=doSomething“hello”|>Async.map Result.Ok
令人惊讶的是,
Async.map
不是一件事。甚至还有

但没关系:实施起来很容易:

module Async =
  map f a = async {
    let! x = a
    return f a
  }
然后:

let doStuff =
    asyncResult {
        let! x = doSomething "hello" |> Async.map Result.Ok
        let! y = doAnotherthing "world" |> Async.map Result.Ok
        let! z = combineTwoAsync x y
        return z
    }