Asynchronous F#:不带计算表达式的单子运算
F#是否提供任何“标准”操作符集来处理计算表达式之外的一元(特别是Asynchronous F#:不带计算表达式的单子运算,asynchronous,f#,monads,Asynchronous,F#,Monads,F#是否提供任何“标准”操作符集来处理计算表达式之外的一元(特别是异步)操作?我发现我的代码中充斥着大量本地运算符定义,如: let (>>=) a b = async.Bind (a, b) 考虑到这组运算符对于编写纯函数有多好-和>等等-我觉得我一定遗漏了一些东西 为了抢占可能的注释,计算表达式在某些方面是不错的,但对于一系列异步操作的管道化来说: async { let! a' = a let! b' = b a' return! c b' } 感觉
异步
)操作?我发现我的代码中充斥着大量本地运算符定义,如:
let (>>=) a b = async.Bind (a, b)
考虑到这组运算符对于编写纯函数有多好-
和>
等等-我觉得我一定遗漏了一些东西
为了抢占可能的注释,计算表达式在某些方面是不错的,但对于一系列异步操作的管道化来说:
async {
let! a' = a
let! b' = b a'
return! c b'
}
感觉不如:
a >>= b >>= c
在F#core libs中没有类似的功能 我想说,这些运营商是后天养成的品味。并不是每个人都是从Haskell进入F#的,对于我们这些不这样做的人来说,这种代码可能并不是真正的“好” 对我来说,这些操作的“管道友好”版本是可行的,作为工作流和内联操作符之间的中间地带:
module Async =
let bind f a = async.Bind (a, f)
a
|> Async.bind b
|> Async.bind c
这使您能够在工作流程之外处理一元类型,同时仍然使用标准的函数组合运算符集:
module Async =
let bind f a = async.Bind (a, f)
a
|> Async.bind b
|> Async.bind c
想要在F#有一个更像哈斯克尔的经历,也许是你想要的。它提供了泛型绑定操作符,以及其他类型类相关的东西。我怀疑,如果没有更高级的类型,它将不会非常有用。如果你想使用两种单子类型,会发生什么?请参阅或谢谢。“管道友好”形式是一个很好的建议。我更感兴趣的是找到一种用惯用的F#做这类事情的简洁方法,而不是复制Haskell语法。