Можно ли избежать определения временной метки при вызове асинхронного рабочего процесса F#?
Предположим, у меня есть асинхронный источник данных:
let getData() = async { return [ 3.14; 2.72 ] }
Я мог бы назвать это с помощью let!
и временная метка:
let showData1() = async {
let! data = getData()
data
|> Seq.iter (printfn "%A")
}
Или я мог бы назвать это (неэффективно!), Используя Async.RunSynchronously
и трубопровод, и без временной метки:
let showData2() = async {
getData()
|> Async.RunSynchronously
|> Seq.iter (printfn "%A")
}
Мне нравится синтаксис showData2
но знаю, что зовет Async.RunSynchronously
связывает вызывающий поток.
Есть ли где-то определенный синтаксис, оператор или функция, которая позволяет мне Async<'T>
в функцию, которая принимает 'T
?
1 ответ
Решение
Звучит так, как ты хочешь map
за Async
:
let mapAsync f a = async {
let! v = a
return (f v)
}
тогда вы можете сделать:
let m: Async<unit> = getData() |> mapAsync (Seq.iter (printfn "%A"))