如何解决在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
。
fix f = let x = f x in x
因此,(1*)
具有整个Int
的固定点,并且fix (1*)
减少到最小的定义,即最小化(在这种情况下为无限循环)。 / p>
在您的定义中,也会发生同样的情况,但是程序已准备好将1
(定义明确的固定点)放在乘法的末尾。当它到达最低点-最小定义的固定点时,不会发生这种情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。