F # Есть ли Async.Sequential для соответствия Async.Parallel? - PullRequest
0 голосов
/ 06 сентября 2018

F # имеет Async.Parallel с сигнатурой типа seq<Async<'a>> -> Async<'a list>, которая будет принимать последовательность асинхронных типов, подготавливать их к параллельной работе и выводить один асинхронный тип.

Мне было интересно, есть ли похожий Async.Sequential, который имеет такую ​​же сигнатуру типа, но запускает каждый элемент в последовательности один за другим? Я чувствую, что, должно быть, упускаю что-то очевидное?

Я бы хотел сделать что-то вроде следующего:

async {
    let! results =
        myItems
        |> List.map myAsynchronousOperation
        |> Async.Sequential

    ... do something with results
}

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Оценить элементы по порядку seq<Async<'a>> и вернуть список - это просто foldBack в последовательности, в которой вы хотите оценить async перед тем, как просто cons добавить его в список. Хотя решение kvb, безусловно, работает, вы также можете сделать это с Seq.foldBack следующим образом:

module Async =
    let sequential s = 
        Seq.foldBack (fun cur acc -> async.Bind(cur, fun head -> 
            async.Bind(acc, fun tail -> async.Return(head :: tail)))) s (async.Return [])
0 голосов
/ 07 сентября 2018

Если кто-то хочет использовать библиотеку AsyncSeq , то в данном примере необходимо выполнить следующее:

async {
    let! results =
        myItems
        |> AsyncSeq.ofSeq
        |> AsyncSeq.mapAsync myAsynchronousOperation
        |> AsyncSeq.toListAsync

    ... do something with results
}

Вероятно, излишнее, если вы еще не используете AsyncSeq для других целей.

0 голосов
/ 06 сентября 2018

Я не думаю, что есть один встроенный, но должно быть тривиально написать свой собственный:

let sequential s = async {
    let results = ResizeArray()
    for a in s do
        let! result = a
        results.Add(result)
    return List.ofSeq results
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...