如果我们像这样定义|>!
运算符,该怎么办:
let (|>!) a f = async {
let! r = a
return f r
}
然后不用写
let! r = fetchAsync()
work r
我们可以写
fetchAsync() |>! work
这是个好主意还是会产生效率低下的代码?
答案 0 :(得分:7)
您所描述的|>!
运算符是standard "map" pattern,它可以应用于几乎任何个“包装”类型,而不仅仅是async
。如果您的return f r
是return! 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