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

时间:2016-01-01 18:55:14

标签: asynchronous f# monads

F#是否提供任何“标准”运算符集来处理计算表达式之外的monadic(特别是Async)运算?我发现我的代码最终散布着很多本地运算符定义,如:

let (>>=) a b = async.Bind (a, b)

考虑到构造纯函数的运算符集合有多好 - <||>>>等等 - 我觉得我必须在这里遗漏一些东西。

为了抢占可能的注释 - 计算表达式适用于某些事情,但是用于管道化一系列异步操作:

async {
    let! a' = a
    let! b' = b a'
    return! c b'
}

感觉不如:

a >>= b >>= c

1 个答案:

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