F#异步映射不同的类型

时间:2014-04-15 00:50:02

标签: asynchronous f# functional-programming

有没有办法使用f#进行以下操作?

let expr0:Async<int> = get0...
let expr1:Async<string> = get1...
//please pretend that this compiles
let finalFuture:Async<string> = 
    Async.Map2 expr0 expr1 (fun (v0:int) (v1:string) -> v0 + v1 ) 

let final:string = Async.RunSynchronously finalFuture

1 个答案:

答案 0 :(得分:5)

异步计算没有预定义的map函数。也许是因为它实际上取决于你想要如何评估两个计算。

如果要按顺序运行它们,可以使用:

let finalFuture = async {
  let! v0 = expr0
  let! v1 = expr1
  return v0 + v1 }

如果您想并行运行它们,可以使用Async.ParallelAsync.StartChild。例如:

let finalFuture = async {
  let! v0Started = Async.StartChild(expr0)
  let! v1Started = Async.StartChild(expr1)
  let! v0 = v0Started
  let! v1 = v1Started
  return v0 + v1 }

在这两种情况下,更改代码以获取函数而不是直接调用+非常容易,因此您应该能够使用这两个代码段来定义自己的map2函数