我有一个"Async.sequence“的简单实现(名称是从这里开始),但是我希望有人检查它的性能、尾调用优化和功能风格。
它具有以下签名,类似于Async.Parallel:
Async<'a> list -> Async<'a list>Async.Parallel对于性能来说是理想的,但是即使操作碰巧是异步的,按顺序运行操作也是很重要的。
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)和retn。cons只是::操作的助手,因为它实际上不是F#中的一个函数。
let sequenceList list =
List.foldBack (map2 cons) list (retn [])使用已经构建的库可能更好,但我喜欢自己定义这些函数,以更好地理解操作之间的关系。现在,我已经有了sequence的公式,我可以将这段代码复制并粘贴到我的结果模块中,这个模块也定义了自己的map2和retn,并且它也能正常工作。
https://codereview.stackexchange.com/questions/135723
复制相似问题