调用 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"))
假设我有一个异步数据源:
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"))