Asynchronous 这个异步管道操作符正常吗

Asynchronous 这个异步管道操作符正常吗,asynchronous,f#,pipeline,Asynchronous,F#,Pipeline,如果我们定义一个|>!像这样的经营者: let (|>!) a f = async { let! r = a return f r } 那就不写了 let! r = fetchAsync() work r 我们可以写 fetchAsync() |>! work 这是一个好主意还是会产生低效的代码?The |>!您描述的运算符是可以应用于几乎任何包装器类型的,而不仅仅是异步的。如果你的回报是回报!f r则会有,根据惯例,如果要为其定义运算符,则应将其写入运算符>

如果我们定义一个|>!像这样的经营者:

let (|>!) a f = async {
    let! r = a
    return f r
} 
那就不写了

let! r = fetchAsync()
work r
我们可以写

fetchAsync() |>! work
这是一个好主意还是会产生低效的代码?

The |>!您描述的运算符是可以应用于几乎任何包装器类型的,而不仅仅是异步的。如果你的回报是回报!f r则会有,根据惯例,如果要为其定义运算符,则应将其写入运算符>>=中

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

let result =
    fetchAsync()
    |> Async.map step1
    |> Async.map step2
    |> Async.map step3
这个|>!您描述的运算符是可以应用于几乎任何包装器类型的,而不仅仅是异步的。如果你的回报是回报!f r则会有,根据惯例,如果要为其定义运算符,则应将其写入运算符>>=中

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

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

Async.map!当然但是现在,很难说哪个是Async.map还是let。。。。然而,我同意Async.map比|>!之类的操作符更好!。但是|>!总比让我来好。。。。但是……我认为你不能这么说!总比让我来好!,因为它们在两种不同的语境中使用。允许只能在像async{…}这样的计算表达式中使用,而您的|>!运算符在计算表达式外部使用。对两者进行比较就像说自行车比雨伞好:它们有不同的功能,并且两者都不能替代另一个,所以比较它们是没有意义的。Async.map!当然但是现在,很难说哪个是Async.map还是let。。。。然而,我同意Async.map比|>!之类的操作符更好!。但是|>!总比让我来好。。。。但是……我认为你不能这么说!总比让我来好!,因为它们在两种不同的语境中使用。允许只能在像async{…}这样的计算表达式中使用,而您的|>!运算符在计算表达式外部使用。对两者进行比较就像说自行车比雨伞好:它们有不同的功能,而且两者都不能替代另一个,所以比较它们是没有意义的。