调用 F# 异步工作流时,是否可以避免定义临时标签?

When calling an F# async workflow, can I avoid defining a temporary label?

假设我有一个异步数据源:

let getData() = async { return [ 3.14; 2.72 ] }

我可以使用 let! 和一个临时标签来调用它:

let showData1() = async {
    let! data = getData()
    data
    |> Seq.iter (printfn "%A")
}

或者,我可以使用 Async.RunSynchronously 和管道调用它(效率低下!),并且没有临时标签:

let showData2() = async {
    getData()
    |> Async.RunSynchronously
    |> Seq.iter (printfn "%A")
}

我喜欢 showData2 的语法,但知道调用 Async.RunSynchronously 会占用调用线程。

是否有在某处定义的语法、运算符或函数允许我将 Async<'T> 传递到接受 'T 的函数中?

听起来你想要 map Async:

let mapAsync f a = async { 
    let! v = a
    return (f v)
}

那么你可以这样做:

let m: Async<unit> = getData() |> mapAsync (Seq.iter (printfn "%A"))