是否有 "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)
有没有“让!”的替代词?支持函数链?
我目前有这个:
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)