geo*_*f_h 3 monads f# asynchronous
F#是否提供任何"标准"运算符集来处理Async计算表达式之外的monadic(特定)运算?我发现我的代码最终散落着许多本地运营商定义,如:
let (>>=) a b = async.Bind (a, b)
Run Code Online (Sandbox Code Playgroud)
如果给定了运营商的有多好是构成纯函数- <|,|>和>>等-我觉得我必须在这里失去了一些东西.
为了抢占可能的注释 - 计算表达式适用于某些事情,但是用于管道化一系列异步操作:
async {
let! a' = a
let! b' = b a'
return! c b'
}
Run Code Online (Sandbox Code Playgroud)
感觉不如:
a >>= b >>= c
Run Code Online (Sandbox Code Playgroud)
在F#核心库中没有任何类型的可用.
我会说这些运营商是一种后天的品味.不是每个人都从Haskell进入F#,对于我们这些没有的人来说,这种代码可能并不真正读作"好".
对我来说有用的是对这些操作进行"管道友好"版本,作为工作流和内联运算符之间的中间地带:
module Async =
let bind f a = async.Bind (a, f)
Run Code Online (Sandbox Code Playgroud)
这使得你可以使用足够的绳索来处理工作流外的monadic类型,同时仍然使用标准的函数组合运算符:
a
|> Async.bind b
|> Async.bind c
Run Code Online (Sandbox Code Playgroud)
为了在F#中获得更多类似Haskell的体验,FsControl可能就是你想要的.它为您提供了泛型绑定运算符,以及其他与类类相关的东西.
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |