2014-11-13 34 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答案,現在看起來很合理:) –

相關問題