Functional programming 冈崎'中的溪流章节;s纯功能数据结构

Functional programming 冈崎'中的溪流章节;s纯功能数据结构,functional-programming,lazy-evaluation,sml,purely-functional,Functional Programming,Lazy Evaluation,Sml,Purely Functional,在关于流的介绍性章节中,Okasaki为流上的drop提供了两个实现 他明确提到第二种方法更有效(并且两者具有相同的语义),但我似乎无法理解为什么一种方法比另一种更有效。任何洞察都将不胜感激。如果非要我猜的话,我会说这是因为第二个版本没有像第一个版本那样使用太多的惰性,但是不管上下文如何,如果你强制任何一点结果,那么你就强制整个计算。例如,假设我想做: val x = hd ($drop(10, l)) 对于第一个版本,我们需要经历所有10次迭代,然后才能得到cons单元(假设流有10个以上的

在关于流的介绍性章节中,Okasaki为流上的
drop
提供了两个实现


他明确提到第二种方法更有效(并且两者具有相同的语义),但我似乎无法理解为什么一种方法比另一种更有效。任何洞察都将不胜感激。

如果非要我猜的话,我会说这是因为第二个版本没有像第一个版本那样使用太多的惰性,但是不管上下文如何,如果你强制任何一点结果,那么你就强制整个计算。例如,假设我想做:

val x = hd ($drop(10, l))
对于第一个版本,我们需要经历所有10次迭代,然后才能得到cons单元(假设流有10个以上的元素)。这与在第二个版本中执行的计算量相同,但是,我们不必处理在每次迭代中创建thunk并强制执行的开销

某些编译器,比如GHC,实际上会执行一种称为严格性分析的方法,在这种方法中,您可以尝试并确定某个特定术语是否将被强制,如果是,则无需创建一个thunk,然后强制它,可以找到有关该术语的更多详细信息

另一方面,对于
则采用

val x = hd ($take(10, l))

在完全延迟版本下,我们只需要评估
take
的第一次迭代,直到我们可以停止为止,而第二个版本的模拟将评估所有10次迭代。在本例中,懒惰可以为您节省一些开支。

谢谢您的解释