我正在阅读Haskell编程书籍并在GHCi解释器中测试提供的示例.事实证明,IntGHCi和Hugs解释器中的类型行为存在差异.根据"Haskel编程"第3章,2^31 :: Int应该超出Int类型范围.同时,在GHCi翻译中,我得到:
Prelude> 2^31 :: Int
2147483648
Run Code Online (Sandbox Code Playgroud)
而在Hugs中它的表现就像书中说的那样:
Hugs> 2^31 :: Int
-2147483648
Run Code Online (Sandbox Code Playgroud)
在GHCi中我甚至可以检查结果是否是类型 Int
Prelude> let x = 2^31 :: Int
Prelude> :type x
x :: Int
Prelude> x
2147483648
Run Code Online (Sandbox Code Playgroud)
描述差异的来源是什么?我应该从Hugs中的书中运行示例还是使用GHCi,这似乎是学习Haskell的推荐选择?我将非常感谢你的帮助.
Tik*_*vis 20
一个Int在Haskell具有支持至少一个范围的[-2^29 .. 2^29-1],但它也可以更大.确切的大小取决于您使用的编译器和您所使用的体系结构.(您可以在2010年Haskell报告中了解更多相关信息,这是Haskell语言的最新标准.)
使用GHC在64位机器上,你将拥有一系列的[-2^63..2^63 - 1].但即使在32位机器上,我相信GHC给你的范围会比严格的最小值(大概[-2^31..2^31 - 1])大一点.
您可以检查实际绑定的内容maxBound和minBound:
> maxBound :: Int
9223372036854775807
Run Code Online (Sandbox Code Playgroud)
实现之间的差异出现了,因为语言定义明确允许它们以不同的方式实现这些类型.就个人而言,我会继续使用GHCi只是记住这一点,因为GHC到目前为止你将使用最可能的编译器.如果你遇到更多的不一致,你可以在标准中查找它们或者询问某人(就像这里一样!); 把它想象成一种学习经历;).
在这方面,该标准是灵活的,以允许不同的编译器和体系结构以不同方式优化其代码.我假设(但不是100%肯定)最小范围是考虑到32位系统,同时也让编译器使用底层32位值中的几个位用于其内部目的,如易于区分指针中的数字.(我知道Python和OCaml的东西,至少可以这样做.)GHC不需要这样做,所以它暴露了适合其架构的完整32或64位.