Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous F#:不带计算表达式的单子运算_Asynchronous_F#_Monads - Fatal编程技术网

Asynchronous 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' } 感觉

F#是否提供任何“标准”操作符集来处理计算表达式之外的一元(特别是
异步
)操作?我发现我的代码中充斥着大量本地运算符定义,如:

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语法。