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

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)

scr*_*wtp 9

在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可能就是你想要的.它为您提供了泛型绑定运算符,以及其他与类类相关的东西.

  • 谢谢。“管道友好”形式是一个很好的建议。我更感兴趣的是找到一种在惯用的 F# 中执行此类操作的简洁方法,而不是重现 Haskell 语法。 (2认同)