F#:没有计算表达式的 Monad 操作

F# : Monad operations without computation expressions

F# 是否提供任何 "standard" 运算符集来处理计算表达式之外的一元(特别是 Async)运算?我发现我的代码最终充斥着大量本地运算符定义,例如:

let (>>=) a b = async.Bind (a, b)

考虑到这组运算符对于组合纯函数有多好 - <||>>> 等 - 我觉得我一定遗漏了一些东西。

为了抢占可能的评论 - 计算表达式对于某些事情来说很好,但对于流水线化一系列异步操作:

async {
    let! a' = a
    let! b' = b a'
    return! c b'
}

感觉不如:

a >>= b >>= c

F# 核心库中没有此类内容。

我会说那些运算符是后天习得的。不是每个人都是从 Haskell 进入 F# 的,对于我们这些不熟悉 F# 的人来说,这种代码可能读起来并不“好”。

对我有用的是拥有这些操作的“pipeline-friendly”版本,作为工作流和内联运算符之间的一种中间地带:

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

这为您提供了足够的途径在工作流之外使用单子类型,同时仍然使用标准的函数组合运算符集:

a
|> Async.bind b
|> Async.bind c  

如需更 Haskell-like 的 F# 体验,FSharpPlus 可能正是您所需要的。