Asynchronous 在Ocaml异步中延迟计算中使用返回

Asynchronous 在Ocaml异步中延迟计算中使用返回,asynchronous,ocaml,Asynchronous,Ocaml,我知道这个问题看起来很傻,但每当我搜索相关答案时,我只会得到关于返回值的一般性问题,所以 我正在通过OCaml研究延迟计算,我得到了它的基本概念。但当我阅读有关延迟计算的函数(主要是Janestreet;)时,我看到了返回函数,但我不明白它的用途 设x=返回1 生成一个立即确定的延迟值,但是如果已经使用延迟计算,那么分配立即值有什么意义呢?为什么不直接给它赋值呢?是因为其他函数(比如bind函数)只接受延迟值,还是有其他好的理由 我们非常欣赏这些例子。谢谢:)您可能会认为return是一个创建延

我知道这个问题看起来很傻,但每当我搜索相关答案时,我只会得到关于返回值的一般性问题,所以

我正在通过OCaml研究延迟计算,我得到了它的基本概念。但当我阅读有关延迟计算的函数(主要是Janestreet;)时,我看到了返回函数,但我不明白它的用途

设x=返回1

生成一个立即确定的延迟值,但是如果已经使用延迟计算,那么分配立即值有什么意义呢?为什么不直接给它赋值呢?是因为其他函数(比如bind函数)只接受延迟值,还是有其他好的理由


我们非常欣赏这些例子。谢谢:)

您可能会认为
return
是一个创建延迟值的函数。当您在其他延迟值的上下文中定义它时,它确实发挥了它的作用。让我们来看看这个例子。假设我们有一个函数读取字符形式的输入通道,并将其大写

let read_uppercased chan = 
  Reader.read_char >>= function
  | `Eof -> return `Eof
  | `Ok ch -> let ch = Char.uppercase ch in
              return (`Ok ch)
在这个函数中,
return
函数实际上有两种用法。前者确实从一个常量创建了一个延迟值,实际上我们不需要在eof发生之前“等待”来创建这个值。例如,我们可以创建一个常量

let return_eof = return `Eof
在任何地方都可以使用它

第二种情况更有趣。它创建了一个延迟值,该值将仅在未来某个地方确定(或者可能永远不会确定)。但是一个很酷的想法是,我们不需要为了定义计算而实际等待值的确定。因此,为了从未来得到一个值,我们使用
bind
函数,然后我们进行一些计算,但之后我们需要确定时间流,并
将结果返回到未来。。。好吧,如果这一切对你没有意义,就把它从你的脑海中抹去吧。不同的人喜欢不同的隐喻


事实上,您可能更清楚地知道,在引擎盖下面,这个返回只是将回调函数连接到其他回调链。

return
bind
join
是属于该术语的动词。单子是结构简单的集合,具有非常有趣的性质。
return
函数将普通值提升到这样的结构中,然后可以根据这些属性对其进行操作。非常感谢您的解释