假设我有一个异步数据源:
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
的函数?
答案 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"))