这个异步管道运算符可以吗

时间:2018-09-01 18:03:05

标签: asynchronous f# pipeline

如果我们像这样定义|>!运算符,该怎么办:

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

然后不用写

let! r = fetchAsync()
work r

我们可以写

fetchAsync() |>! work

这是个好主意还是会产生效率低下的代码?

1 个答案:

答案 0 :(得分:7)

您所描述的|>!运算符是standard "map" pattern,它可以应用于几乎任何个“包装”类型,而不仅仅是async。如果您的return f rreturn! f r,那么您将拥有standard "bind" pattern,如果您正在为其定义运算符,则按照惯例应将其写为运算符>>=。 / p>

这是个好主意,但有一个小改动。您已将异步值作为第一个参数,并将函数作为第二个参数来编写它,但是您使用它的方式fetchAsync() |>! work要求函数是 first 参数,例如let (|>!) f a = ...。 (如果在我链接的第一个示例中查看Scott Wlaschin的实现方式,他也将函数作为第一个参数。)此外,我认为大多数F#程序员都选择不将其写为运算符,而是将其写为运算符。函数称为Async.map,因此其用法如下:

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