在Ocaml Async中使用延迟计算中的return

时间:2014-11-09 00:39:57

标签: asynchronous ocaml

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

我通过OCaml学习延迟计算,我得到了它的基本概念。但是当我阅读有关延迟计算的函数(主要是来自Janestreet的ASync文档; https://ocaml.janestreet.com/ocaml-core/111.28.00/doc/async_kernel/#Deferred.t)时,我看到了返回函数,而我并没有得到它的用途。

让x =返回1

生成一个立即确定的延迟值,但是如果已经使用延迟计算,则分配立即值的重点是什么?为什么不直接为它分配一个正常值?是因为其他函数(如绑定函数)只接受延迟值还是有其他正当理由?

非常感谢例子。谢谢:))

1 个答案:

答案 0 :(得分:4)

您可以将return视为创建延迟值的函数。当您在其他延迟值的上下文中定义它时,它确实扮演着它的角色。我们来看看这个例子吧。假设我们有一个读取char表单输入通道的函数,并将其大写。

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结果带回到未来......好吧,如果这一切对你没有意义,那就把它从你的脑海里抹去吧。不同的人喜欢不同的比喻。

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