我试图找到存在的最大非浮动数字。但是,以下Haskell代码在GHCi中不起作用:
head (reverse [1..])
尝试计算结果时,我的电脑几乎冻结了。我试图通过数学归纳证明,通过采用数字增加列表的最后一个元素,我得到的数量最多。
head(reverse [1])返回1,这个列表的最大数量 head(反向[1..100])返回100,这也是最大的数字。
我真的很困惑。我错过了什么?为什么会出现看似无限的循环? (我等了5分钟才得到结果)我还有其他方法吗?
答案 0 :(得分:4)
理论上,Haskell Integer
完全没有界限,因此没有官方方式来获得最大的一个。在实践中,GHC使用(通常)GNU GMP库,它允许不是非常无界限但仍然是巨大的数字,每个单个数字占据了计算机内存的重要部分。
在实践中,head (reverse [1..])
没有特别优化,以避免逐渐构建内存中的整个数字列表,这意味着您的计算机将很快开始颠簸并耗尽内存。
您可以尝试使用last [1..]
,这应该避免将整个列表保留在内存中,因为它可以逐步进行垃圾回收。但即便如此,你可以运行评估的时间比宇宙存在的时间长,但仍然没有达到目的。
正如评论中所建议的那样,对于许多类型其他而不是Integer
,有一个明确的上限,通常可以通过重载maxBound
来找到,例如使用64位GHCi:
Prelude> maxBound :: Int
9223372036854775807
(即便如此,使用head (reverse [1::Int ..])
并不是一个好主意,我应该知道,因为我只需要在锁定它时重新启动我的机器。)