首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Async.sequence实现

Async.sequence实现
EN

Code Review用户
提问于 2016-07-23 21:12:36
回答 1查看 89关注 0票数 4

我有一个"Async.sequence“的简单实现(名称是从这里开始),但是我希望有人检查它的性能、尾调用优化和功能风格。

它具有以下签名,类似于Async.Parallel

代码语言:javascript
复制
Async<'a> list -> Async<'a list>

Async.Parallel对于性能来说是理想的,但是即使操作碰巧是异步的,按顺序运行操作也是很重要的。

代码语言:javascript
复制
let sequence list =
    let rec loop l acc =
        async {
            match l with
            | [] ->
                return List.rev acc
            | h::t ->
                let! h' = h
                return! loop t (h'::acc)
        }
    loop list []

更新

我提出了一个从其他基本操作构建的最小实现:map + apply (以获取map2)和retncons只是::操作的助手,因为它实际上不是F#中的一个函数。

代码语言:javascript
复制
let sequenceList list =
    List.foldBack (map2 cons) list (retn [])

使用已经构建的库可能更好,但我喜欢自己定义这些函数,以更好地理解操作之间的关系。现在,我已经有了sequence的公式,我可以将这段代码复制并粘贴到我的结果模块中,这个模块也定义了自己的map2retn,并且它也能正常工作。

EN

回答 1

Code Review用户

发布于 2016-07-31 19:16:27

据我所知,这应该是正确的尾调用优化(请参阅这个职位),但我还没有实际检查。

考虑使用AsyncSeq,它可以使异步集合的处理更容易。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/135723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档