有没有“让!”的替代方案?支持函数链?

Sco*_*rod 1 f#

有没有“让!”的替代方案?支持函数链?

我目前有这个:

async {

    let! result = token |> queryDay
    result |> toTransactions
}
Run Code Online (Sandbox Code Playgroud)

但是,我想将上面的代码合并成这样的:

async {

    // NOTE: Async.Await isn't a thing
    let result = token |> queryDay |> Async.Await |> toTransactions
}
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这一目标?

Fyo*_*kin 5

从你的例子中,我假设:

queryDay : 'a -> Async<'b>
toTransactions : 'b -> Async<'c>
Run Code Online (Sandbox Code Playgroud)

像这样链接 monadic 函数被称为"bind"。这是 monad 的核心操作,它的本质。事实上,该let!构造被脱糖为对 的调用async.Bind, 也是如此do!

不幸的是,F# 标准库不提供bindfor的内置独立实现Async。但有一个FSharpx你可以使用:

open FSharpx.Control

async {
   let! result = token |> queryDay |> Async.bind toTransactions
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想使用FSharpx,您可以通过委托给计算构建器轻松地自己制作一个:

module Async =
    let bind f a = async.Bind(a, f)
Run Code Online (Sandbox Code Playgroud)