在Haskell中,1自身无限乘法的结果是什么?

问题描述

在下面的示例中,为什么将任何评估为1的优化视为不正确?

foldl (*) 1 (repeat 1)
^CInterrupted.

解决方法

优化的目的是使程序更快,而无需更改(现在更快)计算结束时得到的答案。

由于foldl (*) 1 (repeat 1)是作为无限循环开始的,因此在进行优化之后,尽管它可能会更快地遍历循环主体的每个迭代,但它仍必须经历无限多次迭代,才能避免改变得到的答案。 / p>

,

Daniel Wagner给出了一个很好的答案,但我想在无穷乘法上加一点。

在某种程度上,您要尝试的操作与该语言中的以下表达式匹配(机制当然是不同的-参见the definition of fix:我们没有累积的产品-仅是应用程序的序列;我只是想从另一个角度给出答案,这是不存在的):

fix (1*)

Data.Function.fix's description

fix f是函数f的最小固定点,即定义最少的x,使得f x = x

And here is the definition

fix f = let x = f x in x

因此,(1*)具有整个Int的固定点,并且fix (1*)减少到最小的定义,即最小化(在这种情况下为无限循环)。 / p>

在您的定义中,也会发生同样的情况,但是程序已准备好将1(定义明确的固定点)放在乘法的末尾。当它到达最低点-最小定义的固定点时,不会发生这种情况。