gpt4 book ai didi

asynchronous - 在 F# 中优化映射异步序列的语法

转载 作者:行者123 更新时间:2023-12-04 19:04:04 27 4
gpt4 key购买 nike

我试图找出以下 F# 表达式的有效语法。假设我有一个 F# 异步计算:

let asyncComp n = async { return n }

它有一个签名 'a -> Async<'a> .现在我定义了一个序列:
let seqOfAsyncComps = 
seq {
yield asyncComp 1
yield asyncComp 2
yield asyncComp 3
}

现在我有一个 seq<Async<int>> 的项目.如果我想异步映射来自 seq<Async<int>> 的元素怎么办?至 seq<Async<int>> .这行不通:
let seqOfAsyncSquares =
seqOfAsyncComps |> Seq.map (fun x -> x * x) // ERROR!!!

当然, xAsync<int> , 我必须提取一个 int首先,我可以改为执行以下操作:
let seqOfAsyncSquares =
seqOfAsyncComps |> Seq.map (fun x -> async {
let! y = x
return y * y }) // OK

这工作正常,但语法很笨拙。它带走了 F# 的紧凑性,如果我想链接几个 seq处理我必须在每个 map 中做同样的技巧, filteriter .

我怀疑可能有更有效的语法来处理由异步计算组成的序列。

最佳答案

您可以使用 Async.map (我现在才公然地 stolen from Tomas Petricek ):

module Async =
let map f workflow = async {
let! res = workflow
return f res }

let seqOfAsyncSquares' =
seqOfAsyncComps |> Seq.map (Async.map (fun x -> x * x))

如果您对其进行评估,您会发现它似乎产生了预期的结果:
> seqOfAsyncSquares' |> Async.Parallel |> Async.RunSynchronously;;
val it : int [] = [|1; 4; 9|]

关于asynchronous - 在 F# 中优化映射异步序列的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29459042/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com