ocaml中的延迟评估

时间:2017-09-19 19:08:43

标签: ocaml deferred

我正在关注“使用Objective-CAML开发应用程序”的第107页上的示例。

type 'a v = Imm of 'a| Def of (unit -> 'a)

现在我想了解构造函数类型Def如何执行延迟评估?将De参数化为(unit -> 'a)

是什么意思?

1 个答案:

答案 0 :(得分:4)

类型unit -> 'a代表一个函数。因此,在调用函数之前,计算不会发生。即,它被推迟了。

unit表示当您调用该函数时,您将传递()(类型为unit的值,实际上是该类型的唯一值)。

'a表示函数返回由类型构造函数v的参数指定的类型的值。所以int v是返回int的延迟计算的类型。等等。

<强>更新

以下是float v类型的值:

let deferred_float = Def (fun () -> sin 1.0)

请注意,Def不是类型。它是一个一元值构造函数(如Some)。将Def视为采用类型unit -> 'a的值的函数并返回类型'a v的值通常很有用。或者您可以将其视为保存该功能的小型标记数据结构。在任何一种情况下,它都是一个值,而不是一个类型。

以下是它在顶层中的样子:

# let deferred_float = Def (fun () -> sin 1.0);;
val deferred_float : float v = Def <fun>

如果您想象计算sin 1.0需要很长时间(比如说一分钟),那么关键是值deferred_float或多或少是瞬间构建的。 sin 1.0的计算推迟到您实际调用包含的函数。