2010-07-16 24 views
5

J'ai ici une fonction de haskell courte qui est censée convertir "ABCDEF" en 0x41,0x42,0x43,0x44,0x45,0x46 (leurs valeurs ASCII), puis les multiplier pour qu'elle devienne 0x4142,4344,4546 mais semble limiter la longueur entière - je pensais haskell utilisé bignums arbitraires?La fonction Haskell semble limiter la longueur entière - je pensais qu'elle utilisait des bignums?

La dernière ligne du code fonctionne très bien, ce qui me déconcerte

Toutes les idées? Merci beaucoup

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) 

La sortie est:

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

Voir aussi http://stackoverflow.com/questions/3429291/haskell-int-and-integer –

+0

Les types sont vos amis. Ajouter des signatures de type, et il est clair ce qui se passe! –

Répondre

10

Votre problème est que ord retourne un Int, qui est largeur fixe. Vous voulez toInteger $ ord h.

+1

Donc il y a une différence entre un Int et un Integer? – Chris

+2

@Chris Oui, voir http://www.haskell.org/tutorial/numbers.html – chollida