我正在关注“使用Objective-CAML开发应用程序”的第107页上的示例。
type 'a v = Imm of 'a| Def of (unit -> 'a)
现在我想了解构造函数类型Def
如何执行延迟评估?将De
参数化为(unit -> 'a)
?
答案 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
的计算推迟到您实际调用包含的函数。