Haskell中的迭代和垃圾收集

Haskell中的迭代和垃圾收集,haskell,garbage-collection,ghc,Haskell,Garbage Collection,Ghc,我有一个关于GHC如何实现一个简单代码的问题。性能和技术问题 这是John Hughes“为什么函数式编程很重要”一文中的一个简单示例。平方根计算 要进行计算,我们需要先前的近似值,我们可以使用iterate函数创建包含近似值的列表: [a0,f(a0),f(f(a0),…]等等 然后,在方便的时候,它将停止: within eps (a:b:xs) = if abs(a-b) < eps then b else within eps (b:xs) eps(a:b:xs)内的=如果abs

我有一个关于GHC如何实现一个简单代码的问题。性能和技术问题

这是John Hughes“为什么函数式编程很重要”一文中的一个简单示例。平方根计算

要进行计算,我们需要先前的近似值,我们可以使用iterate函数创建包含近似值的列表:

[a0,f(a0),f(f(a0),…]等等

然后,在方便的时候,它将停止:

within eps (a:b:xs) = if abs(a-b) < eps then b else within eps (b:xs)
eps(a:b:xs)内的
=如果abs(a-b)
问题是如何在恒定空间中执行此操作

GC是否知道在递归调用中,eps(b:xs)
内的
列表的头
a
不再在范围内,然后被收集

如果是这种情况,那么在每次迭代中,GHC是否总是在内存中创建然后销毁一个位置(变量)?在始终重用变量的过程语言中,这如何执行

GC是否知道在递归调用中,在
eps(b:xs)
中,列表的头
a
不再在范围内,然后它被收集

如果是这种情况,那么在每次迭代中,GHC是否总是在内存中创建并销毁一个位置(变量)

对于这个例子,几乎可以肯定是的。在某些情况下,列表融合可以将基于列表的算法变成紧密的、不分配的循环;如果您仅使用内置函数来生成和使用列表,则最有可能发生这种情况

在变量总是被重用的过程语言中,这如何执行

分配器和GC经过调优,可以进行大量的分配和收集。通常分配只会碰到指针。偶尔会碰到GC,但从第一代到第二代只需要复制一个
Float
(或者只有一个
Float
和一些闭包或其他东西——你知道,大部分数据不需要接触,因为它们是不可访问的),这同样非常便宜。显然有一些开销,但通常你所做的计算足够复杂,需要占用大部分运行时间