让我用一个例子来解释一下我所说的对成本敏感的折叠是什么意思:以任意精度计算 pi。我们可以使用Leibniz 公式(不是很有效,但又好又简单)和惰性列表,如下所示:
pi = foldr1 (+) [(fromIntegral $ 4*(-1)^i)/(fromIntegral $ 2*i+1) | i<-[0..]]
现在,显然这个计算永远不会完成,因为我们必须计算无限列表中的每个值。但在实践中,我不需要 pi 的确切值,我只需要它到某个指定的小数位数。我可以这样定义 pi':
pi' n = foldr1 (+) [(fromIntegral $ 4*(-1)^i)/(fromIntegral $ 2*i+1) | i<-[0..n]]
但我需要传入 n 的什么值才能获得我想要的精度,这一点并不明显。我需要的是某种对成本敏感的折叠,只要我达到所需的精度,它就会停止折叠。这样的折叠存在吗?
(注意,在这种情况下,很容易看出我们是否已经达到了要求的精度。因为莱布尼茨公式使用了一个与每一项交替符号的序列,所以误差总是小于下一项的绝对值。序列。)
编辑:拥有成本敏感的折叠,也可以考虑计算时间/功耗,这将是非常酷的。例如,考虑到我有 1 小时的计算时间和 10kW-hrs 的时间,我想要最准确的 pi 值。但我意识到这将不再是严格的功能。