是否有 "let!" 的替代方法来支持函数链接?

Is there an alternative to "let!" to support function chaining?

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

我目前有这个:

async {

    let! result = token |> queryDay
    result |> toTransactions
}

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

async {

    // NOTE: Async.Await isn't a thing
    let result = token |> queryDay |> Async.Await |> toTransactions
}

有办法实现吗?

根据您的示例,我假设:

queryDay : 'a -> Async<'b>
toTransactions : 'b -> Async<'c>

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

也是如此。

遗憾的是,F# 标准库没有为 Async 提供 bind 的内置独立实现。但是有一个 in FSharpx 可以使用:

open FSharpx.Control

async {
   let! result = token |> queryDay |> Async.bind toTransactions
}

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

module Async =
    let bind f a = async.Bind(a, f)