Это асинхронный оператор конвейерной передачи нормально - PullRequest
0 голосов
/ 01 сентября 2018

Что если мы определим оператор |>! следующим образом:

let (|>!) a f = async {
    let! r = a
    return f r
} 

Тогда вместо написания

let! r = fetchAsync()
work r

мы могли бы написать

fetchAsync() |>! work

Это хорошая идея или генерирует неэффективный код?

1 Ответ

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

Оператор |>!, который вы описываете, является стандартным шаблоном "map" , который может применяться только к любому типу "оболочки", а не только к async. Если бы ваш return f r был return! f r, то у вас был бы стандартный шаблон «связывания» , который по соглашению должен быть записан как оператор >>=, если вы определяете для него оператор.

И это хорошая идея, но с одним незначительным изменением. Вы записали его с асинхронным значением в качестве первого параметра и функцией в качестве второго параметра, но для того, чтобы использовать его, fetchAsync() |>! work, требуется, чтобы эта функция была параметром first , например. let (|>!) f a = .... (Если вы посмотрите на то, как Скотт Влашин реализует это в первом примере, который я связал, он также помещает функцию в качестве первого параметра.) Кроме того, я думаю, что большинство программистов на F # предпочли бы не писать это как оператор, а как функция называется Async.map, поэтому ее использование будет выглядеть так:

let result =
    fetchAsync()
    |> Async.map step1
    |> Async.map step2
    |> Async.map step3
...