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

标签 asynchronous ocaml

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

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

让 x = 返回 1

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

非常感谢示例。谢谢 :)

最佳答案

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

let read_uppercased chan = 
  Reader.read_char >>= function
  | `Eof -> return `Eof
  | `Ok ch -> let ch = Char.uppercase ch in
              return (`Ok ch)

在这个函数中,我们实际上有两个使用 return功能。前者确实从常量创建了一个延迟值,实际上我们不需要在 eof 发生之前“等待”来创建这个值。例如我们可以创建一个常量 deferred
let return_eof = return `Eof

并在任何地方使用它。

第二个事件更有趣。它创建了一个延迟值,该值将仅在将来的某个地方确定(或者可能永远不会确定)。但是很酷的想法是,我们实际上不需要等待确定值来定义计算。因此,为了带来 future 的值(value),我们使用 bind函数,然后我们做一些计算,但之后我们需要修复时间流,到return结果回到 future ......好吧,如果这一切对你来说没有意义,那就把它从你的脑海中抹去。不同的人喜欢不同的比喻。

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

关于asynchronous - 在 Ocaml Async 中的延迟计算中使用 return,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26823701/

相关文章:

c++ - C++11 中的 async(launch::async) 是否会使线程池过时以避免昂贵的线程创建?

entity-framework - Entity Framework 异步与 Task.FromResult

ocaml 内存在应用于斐波那契数列时失败

ocaml - 在 OCaml 中打印元组

functional-programming - OCaml 中的 `union` 是什么,真的

javascript - 数据表每 5 秒更新一次单列

c# - 如何处理任务等待程序中未处理的异常

ocaml - Seq展开是如何实现的

environment-variables - 如何检索所有可用的环境变量?

c# - 为什么这个任务会提前返回?我做错了什么吗?