Можно ли избежать определения временной метки при вызове асинхронного рабочего процесса 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"))
Другие вопросы по тегам