gpt4 book ai didi

haskell - Haskell中没有错误消息

转载 作者:行者123 更新时间:2023-12-03 07:45:16 25 4
gpt4 key购买 nike

出于好奇,我制作了一个简单的脚本来检查在Haskell中构建列表的速度和内存效率:

wasteMem :: Int -> [Int]
wasteMem 0 = [199]
wasteMem x = (12432483483467856487256348746328761:wasteMem (x-1))

main = do
putStrLn("hello")
putStrLn(show (wasteMem 10000000000000000000000000000000000))

奇怪的是,当我尝试此操作时,它没有耗尽内存或堆栈空间,它只打印[199],与运行WasteMem 0相同。它甚至不打印错误消息...为什么?在ghci中输入这个大数字只会打印数字,因此我认为这不是四舍五入或读取错误。

最佳答案

您的程序使用的数字大于maxBound :: Int32。这意味着它在不同平台上的行为会有所不同。对于GHC x86_64,Int是64位(否则为32位,但是Haskell报告仅 promise 29位)。这意味着您的荒谬值(1x10 ^ 34)对我来说表示为4003012203950112768,对于32位用户则表示为零:

GHCI> 10000000000000000000000000000000000 :: Int
4003012203950112768
GHCI> 10000000000000000000000000000000000 :: Data.Int.Int32
0

通过使用固定大小的类型(例如,来自Data.Word或Data.Int)或使用Integer,可以使平台独立。

综上所述,这是一个构思不佳的测试。 Haskell是惰性的,因此 wastedMem n所消耗的任何 n值内存量都是最小的-只是 thunk。一旦您尝试显示此结果,它将一次从列表中抓取元素-首先生成 "[12432483483467856487256348746328761,,并将列表的其余部分保留为大块。第一个值可以在甚至不考虑第二个值之前被垃圾回收(恒定空间程序)。

关于haskell - Haskell中没有错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7524114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com