有没有“让!”的替代方案?支持函数链?
f#
有没有“让!”的替代方案?支持函数链?
我目前有这个:
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# 标准库不提供bindfor的内置独立实现Async。但有一个在FSharpx你可以使用:
open FSharpx.Control
async {
let! result = token |> queryDay |> Async.bind toTransactions
}
或者,如果您不想使用FSharpx,您可以通过委托给计算构建器轻松地自己制作一个:
module Async =
let bind f a = async.Bind(a, f)