Если вы хотите использовать произвольный доступ, вам следует использовать массивы.Произвольный доступ к элементам списка будет работать, но он неэффективен (он должен перебирать список с самого начала).Версия, использующая массивы, будет выглядеть следующим образом:
// Needs to be declared as array
let conslist = [|f1; f2|];;
// Add type annotations to specify that arguments are arrays
let pmap2 (arr1:_[]) (arr2:_[]) =
seq { for i in 0 .. 1 do
yield async { return arr1.[i] arr2.[i] } }
|> Async.Parallel |> Async.RunSynchronously
Однако вы также можете переписать пример для работы с любыми последовательностями (включая массивы и списки), используя функцию Seq.zip
.Я думаю, что это решение более элегантно и не заставляет вас использовать императивные массивы (и оно не имеет недостатка в производительности):
// Works with any sequence type (array, list, etc.)
let pmap2 functions arguments =
seq { for f, arg in Seq.zip functions arguments do
yield async { return f arg } }
|> Async.Parallel |> Async.RunSynchronously