F# 是否提供任何“标准”运算符集来处理计算表达式之外的单子(monad)(特别是 Async
)操作?我发现我的代码最终充满了许多本地运算符定义,例如:
let (>>=) a b = async.Bind (a, b)
考虑到一组运算符对于组合纯函数有多好 -
<|
, |>
和 >>
等等 - 我觉得我一定在这里遗漏了一些东西。为了抢占可能的注释 - 计算表达式对于某些事情很好,但对于流水线一系列异步操作:
async {
let! a' = a
let! b' = b a'
return! c b'
}
感觉不如:
a >>= b >>= c
最佳答案
F# 核心库中没有这种类型的可用。
我会说那些运算符(operator)是后天习得的。不是每个人都是从 Haskell 进入 F# 的,对于我们这些不这样做的人来说,这种代码可能读起来并不“好”。
对我有用的是拥有这些操作的“管道友好”版本,作为工作流和内联运算符之间的一种中间立场:
module Async =
let bind f a = async.Bind (a, f)
这为您提供了足够的绳索来处理工作流程之外的单子(monad)类型,同时仍然使用标准的函数组合运算符集:a
|> Async.bind b
|> Async.bind c
要在 F# 中获得更类似于 Haskell 的体验,FSharpPlus可能是你正在寻找的。
关于asynchronous - F# : Monad operations without computation expressions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34559024/