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 可能正是您所需要的。
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 可能正是您所需要的。