Операция async.Bind
является базовым примитивом , который асинхронные рабочие процессы обеспечивают для последовательной компоновки - в синтаксисе блока async
, который соответствует let!
.Вы можете использовать это для выражения последовательной композиции двух вычислений (как продемонстрировал Даниэль).
Однако, если у вас есть операция <|>
, которую определил Даниэль, это не достаточно выразительно, чтобы реализовать async.Bind
, потому что, когда вы составляете вещи последовательно, используя async.Bind
, второе вычисление может зависеть от результатапервого.<e2>
может использовать v1
:
async.Bind(<e1>, fun v1 -> <e2>)
Если вы писали <e1> <|> <e2>
, тогда эти две операции должны быть независимыми.Это причина, по которой библиотеки основаны на Bind
- потому что это более выразительная форма последовательной композиции, чем та, которую вы получили бы, если бы вы следовали структуре Async.Parallel
.
Если вы хотите что-токоторый ведет себя как Async.Parallel
и принимает массив, тогда самый простой вариант - это реализовать это обязательно, используя let!
в цикле (но вы также можете использовать рекурсию и списки):
let Sequential (ops:Async<'T>[]) = async {
let res = Array.zeroCreate ops.Length
for i in 0 .. ops.Length - 1 do
let! value = ops.[i]
res.[i] <- value
return res }