F#是否提供任何“标准”运算符集来处理计算表达式之外的monadic(特别是Async
)运算?我发现我的代码最终散布着很多本地运算符定义,如:
let (>>=) a b = async.Bind (a, b)
考虑到构造纯函数的运算符集合有多好 - <|
,|>
和>>
等等 - 我觉得我必须在这里遗漏一些东西。
为了抢占可能的注释 - 计算表达式适用于某些事情,但是用于管道化一系列异步操作:
async {
let! a' = a
let! b' = b a'
return! c b'
}
感觉不如:
a >>= b >>= c
答案 0 :(得分:9)
F#核心库中没有这种类型。
我想说这些运营商是一种后天的品味。不是每个人都从Haskell进入F#,而对于我们这些没有的人来说,这种代码可能并不真正读作“好”。
对我来说有用的是对这些操作进行“管道友好”版本,作为工作流和内联运算符之间的中间地带:
module Async =
let bind f a = async.Bind (a, f)
在使用标准的函数组合运算符集的同时,它为您提供足够的绳索来处理工作流外的monadic类型:
a
|> Async.bind b
|> Async.bind c
对于F#中更像Haskell的体验,FsControl可能就是你要找的东西。它为您提供了泛型绑定运算符,以及与类型类相关的东西。