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

标签 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绑定(bind)调用线程。

是否有在某处定义的语法、运算符或函数允许我通过管道传输 Async<'T>进入接受 'T 的函数?

最佳答案

听起来你想要map用于异步:

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

那么你可以这样做:

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

关于f# - 调用 F# 异步工作流程时,我可以避免定义临时标签吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30416774/

相关文章:

f# - 在 C# 中使用 F# 选项。例如FSharpOption<字典<Guid, MembershipUser>>

f# - F# 中的组合和排列

F# Async.RunSynchronously 带有超时和取消 token

scala - F# 的异步工作流的 Scala 等价物是什么?

f# - 暂停和恢复 F# 异步工作流程 (Async<'T>)

f# - 简化表达式 F#

multithreading - 如何限制在 F# 中为异步 Seq.map 操作创建的线程数?

f# - F# 相当于 C#'s ' out'