Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么Int类型2^31不超出GHCi中的范围?_Haskell_Ghci_Hugs - Fatal编程技术网

Haskell 为什么Int类型2^31不超出GHCi中的范围?

Haskell 为什么Int类型2^31不超出GHCi中的范围?,haskell,ghci,hugs,Haskell,Ghci,Hugs,我正在阅读这本书,并测试GHCi解释器中提供的示例。事实证明,GHCi和Hugs解释器中的Int类型行为存在差异。根据“Haskel编程”的第3章,2^31::Int应该超出Int类型的范围。同时,在GHCi解释器中,我得到: Prelude> 2^31 :: Int 2147483648 拥抱时,它的行为就像书上说的: Hugs> 2^31 :: Int -2147483648 在GHCi中,我甚至可以检查结果是否为Int类型 Prelude> let x = 2^31

我正在阅读这本书,并测试GHCi解释器中提供的示例。事实证明,GHCi和Hugs解释器中的
Int
类型行为存在差异。根据“Haskel编程”的第3章,
2^31::Int
应该超出
Int
类型的范围。同时,在GHCi解释器中,我得到:

Prelude> 2^31 :: Int
2147483648
拥抱时,它的行为就像书上说的:

Hugs> 2^31 :: Int
-2147483648
在GHCi中,我甚至可以检查结果是否为
Int类型

Prelude> let x = 2^31 :: Int
Prelude> :type x
x :: Int
Prelude> x
2147483648

所述差异的来源是什么?我应该运行《拥抱》一书中的示例,还是使用GHCi,这似乎是学习Haskell的推荐选择?非常感谢您的帮助。

很可能您使用的是一个64位系统,
Int
具有64位

试试这个:

Prelude> 2^62::Int
4611686018427387904
Prelude> 2^63::Int
-9223372036854775808

Haskell中的
Int
必须至少支持
[-2^29..2^29-1]
,但也可以更大。确切的大小取决于您使用的编译器和所使用的体系结构。(您可以在中了解更多信息,这是Haskell语言的最新标准。)

使用64位计算机上的GHC,您将拥有
[-2^63..2^63-1]
的范围。但即使在32位机器上,我相信GHC提供的范围也会比严格的最小值稍大一些(大概是
[-2^31..2^31-1]

您可以使用
maxBound
minBound
检查实际绑定是什么:

> maxBound :: Int
9223372036854775807
实现之间的差异是因为语言定义明确允许它们以不同的方式实现这些类型。就个人而言,我会继续使用
GHCi
记住这一点,因为
GHC
是迄今为止您最可能使用的编译器。如果你遇到更多的不一致,你可以在标准中查找它们,或者询问某人(就像这里!);将其视为一种学习体验;)


该标准在这方面是灵活的,允许不同的编译器和体系结构以不同的方式优化其代码。我假设(但不是100%确定)最小范围是在考虑32位系统的情况下给出的,同时也允许编译器使用底层32位值中的一些位来实现其自身的内部目的,例如轻松区分数字和指针。(我知道Python和OCaml至少可以做到这一点。)GHC不需要这样做,因此它根据其体系结构公开完整的32位或64位。

Int
是机器大小的。因此,在32位平台上,它将在231位溢出


请注意,Haskell报告实际上没有具体说明
Int
应该有多大——正如Tikhon Jelvis所说,它只保证处理229个。但是GHC确实使用了所有的机器整数,这通常是相当最优的性能,而且需要明智的选择。

感谢您提供了非常描述性的答案:)我会按照您的建议,在学习时坚持使用
ghci
Haskell@SzymonStepniak:酷。如果你遇到更多令人困惑的矛盾,请在这里随意提问。我一定会这么做的。再次感谢!在GHC中,即使在32位机器上,INT也是64位的,但是总是有
数据。INT.Int32
如果您需要更小的版本(由于某种原因,它甚至比我的32位机器上的64位INT慢),谢谢您的回答,现在看起来很合理:)您应该卸载它hugs@alternative:我想应该把拥抱下载下来!或者可能移动到一个模糊的位置,并受到某种特定于Haskell的验证码的保护,该验证码需要详细了解Haskell 98和Haskell 2010之间的差异,才能回答“其中Int有64位。”说明谁?GHC中的
Int
是使用机器整数实现的。@JoachimBreitner Ubuntu包管理器中的GHC版本使用64位表示
Int
,即使在32位机器上也是如此(出于某种原因,这比使用
Data.Int.Int32
更快)
$ ssh pi@192.168.0.3
Linux raspberrypi 3.12.28+ #709 PREEMPT Mon Sep 8 15:28:00 BST 2014 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Nov 11 12:58:20 2014 from 192.168.0.102
pi@raspberrypi:~$ ghci
GHCi, version 7.8.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> 2^31 :: Int
-2147483648