我知道这个问题可能看起来很愚蠢,但每当我搜索到相关答案时,我只会得到关于返回值的一般性问题,所以......
我通过OCaml学习延迟计算,我得到了它的基本概念。但是当我阅读有关延迟计算的函数(主要是来自Janestreet的ASync文档; https://ocaml.janestreet.com/ocaml-core/111.28.00/doc/async_kernel/#Deferred.t)时,我看到了返回函数,而我并没有得到它的用途。
让x =返回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
结果带回到未来......好吧,如果这一切对你没有意义,那就把它从你的脑海里抹去吧。不同的人喜欢不同的比喻。
事实上,也许你会更清楚地知道,在引擎盖下,这个返回只是将回调函数连接到其他回调链。