作者:凡秘能 | 来源:互联网 | 2022-12-05 21:43
如果我们定义这样的|>!
运算符怎么办:
let (|>!) a f = async {
let! r = a
return f r
}
然后而不是写作
let! r = fetchAsync()
work r
我们可以写
fetchAsync() |>! work
这是一个好主意还是会产生效率低下的代码?
1> rmunn..:
|>!
您正在描述的运算符是标准的"映射"模式,它可以应用于几乎任何 "包装"类型,而不仅仅是async
.如果你return f r
曾经return! f r
那么你会有标准的"绑定"模式,>>=
如果你为它定义一个运算符,按照惯例应该写成运算符.
这是一个好主意,但只有一个小小的改变.您使用async值作为第一个参数并将函数作为第二个参数编写,但是您使用它的方式fetchAsync() |>! work
要求函数是第一个参数,例如let (|>!) f a = ...
.(如果你顺便看看斯科特Wlaschin实现了这个在我联系的第一个例子,他把函数作为第一个参数为好.)另外,我想大多数F#程序员会选择不写这个作为一个经营者,而是作为一个函数调用Async.map
,以便它的用法如下所示:
let result =
fetchAsync()
|> Async.map step1
|> Async.map step2
|> Async.map step3