2014-11-13 35 views
6

我正在阅读Programming in Haskell书籍和测试,它提供了GHCi口译员的例子。事实证明,GHCi和Hugs解释器中的Int类型行为存在差异。根据“Haskel编程”第3章,2^31 :: Int应该超出Int类型的范围。同时,在GHCI解释,我得到:为什么Int 2^31不会超出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 
类型

描述的差异的来源是什么?我应该在Hugs中运行书中的例子还是使用GHCi,这似乎是学习Haskell的推荐选择?我会很感激你的帮助。

+3

你应该只是卸载拥抱 – alternative

+0

@alternative:我认为下载的拥抱应该被取消!或者也许移动到一个模糊的位置,并受某种Haskell特定的CAPTCHA的保护,它需要详细了解Haskell98和Haskell2010之间的差异来回答... – yatima2975

回答

20

在Haskell的Int具有支持至少[-2^29 .. 2^29-1]的范围内,但它也可以更大。确切的大小将取决于您使用的编译器和您所在的架构。 (您可以在2010 Haskell Report这个最新的Haskell语言标准中阅读更多关于这方面的内容。)

使用64位机器上的GHC,您的范围为[-2^63..2^63 - 1]。但即使在32位机器上,我相信GHC的范围会比严格的最小值大一点(大概[-2^31..2^31 - 1])。

您可以检查一下实际的边界与maxBoundminBound

> maxBound :: Int 
9223372036854775807 

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

该标准在这方面很灵活,允许不同的编译器和体系结构以不同的方式优化其代码。我假设(但不是100%肯定)最小范围是在32位系统的基础上给出的,同时也让编译器使用来自底层32位值的几位来实现其自身的内部目的,如易于区分来自指针的数字。 (至少我知道Python和OCaml是这样的。)GHC不需要这样做,所以它公开了适合其体系结构的完整32位或64位。

+0

感谢您的非常具有描述性的回答:)我会按照你的建议,在学习Haskell时坚持'ghci' –

+3

@SzymonStepniak:很酷。如果遇到更多令人困惑的不一致情况,请随时在此处询问。 –

+0

我肯定会这样做的。再次感谢! –

4

很可能你在64位系统上,其中Int有64位。

尝试这种情况:

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

正确,它是64位cpu。感谢您指出:) –

+0

“其中一个Int有64位。”说谁? – newacct

+0

GHC中的'Int'是使用机器整数实现的。 –

4

Int是机器大小。所以在32位的平台上它会溢出在2 。

$ ssh [email protected] 
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 
[email protected]:~$ 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 

注意Haskell的报告确实没有规定多大Int应该是,正是由于–吉洪Jelvis说,它只是保证处理2 。但GHC肯定会使用所有机器整数,这通常是相当优化的性能和需求。

+0

Thanks for答案,现在看起来很合理:) –

相关问题