asynchronous - F# : Monad operations without computation expressions

标签 asynchronous f# monads

F# 是否提供任何“标准”运算符集来处理计算表达式之外的单子(monad)(特别是 Async )操作?我发现我的代码最终充满了许多本地运算符定义,例如:

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

考虑到一组运算符对于组合纯函数有多好 - <| , |>>>等等 - 我觉得我一定在这里遗漏了一些东西。

为了抢占可能的注释 - 计算表达式对于某些事情很好,但对于流水线一系列异步操作:
async {
    let! a' = a
    let! b' = b a'
    return! c b'
}

感觉不如:
a >>= b >>= c

最佳答案

F# 核心库中没有这种类型的可用。
我会说那些运算符(operator)是后天习得的。不是每个人都是从 Haskell 进入 F# 的,对于我们这些不这样做的人来说,这种代码可能读起来并不“好”。
对我有用的是拥有这些操作的“管道友好”版本,作为工作流和内联运算符之间的一种中间立场:

module Async = 
    let bind f a = async.Bind (a, f)
这为您提供了足够的绳索来处理工作流程之外的单子(monad)类型,同时仍然使用标准的函数组合运算符集:
a
|> Async.bind b
|> Async.bind c  
要在 F# 中获得更类似于 Haskell 的体验,FSharpPlus可能是你正在寻找的。

关于asynchronous - F# : Monad operations without computation expressions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34559024/

相关文章:

haskell - 了解流媒体库中的类型

asynchronous - 任务.继续困惑

asp.net-mvc - ASP.NET MVC 在Controller中异步实现的最佳方式

javascript - 使用 Node.js 更好地理解回调

javascript - 让所有功能异步的任何缺点?

multithreading - 如何将 parMap 与一元函数一起使用?

haskell - 重构使用 Reader monad 的 Haskell 函数

f# - 如何插入代码质量指标 - FAKE F#MAKE

.net - 请求提交后无法执行此操作

enums - F#等效于Enum.TryParse