2010-07-16 15 views
5

Burada "ABCDEF" 0x41,0x42,0x43,0x44,0x45,0x46 (ascii değerleri) dönüştürmek için kısa bir haskell işlevi var, sonra 0x4142,4344,4546 olur, böylece onları çarpın tamsayı uzunluğunu sınırlıyor gibi görünüyor - haskell keyfi bignums kullandığını düşündüm?Haskell işlevi tamsayı uzunluğunu sınırlıyor gibi görünüyor - bignum kullandığını düşündüm?

kodunun son satırı bana

Herhangi bir fikir bulmaca, hangi çalışıyor? Çok teşekkürler

import Data.Char 
import Numeric 

strToHex2 (h:[]) = ord h 
strToHex2 (h:t) = (ord h) + ((strToHex2 t) * 256) 
strToHex s = strToHex2 (reverse s) 

main = do 
    print(strToHex "ABCDEF") 
    print ((((((((0x41*256+0x42)*256)+0x43)*256)+0x44)*256)+0x45)*256+0x46) 

çıktısı:

1128547654  <- limited to 32 bits for some reason? 
71752852194630 <- that's fine 
+1

Ayrıca bkz. Http://stackoverflow.com/questions/3429291/haskell-int-and-integer –

+0

Türler arkadaşınız. Tip imzaları ekleyin ve neler olup bittiği bellidir! –

cevap

10

Senin sorunun ord bir Int döndüren yani, hangi sabit genişlikli olduğunu. toInteger $ ord h'u istiyorsun.

+1

Int ve Integer arasında bir fark var? – Chris

+2

@Chris Evet, bkz. Http://www.haskell.org/tutorial/numbers.html – chollida

İlgili konular