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

时间:2015-05-23 19:32:12

标签: f# async-workflow

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

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的函数?

1 个答案:

答案 0 :(得分:5)

听起来你想map代表Async

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

然后你可以这样做:

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