2010-07-16 10 views
5

aquí tengo una función de haskell corta que se supone que convierte "ABCDEF" en 0x41,0x42,0x43,0x44,0x45,0x46 (sus valores de ascii), luego multiplíquelos para que se convierta en 0x4142,4344,4546 pero parece estar limitando la longitud de los enteros. ¿Creí que Haskell usó bignums arbitrarios?La función de Haskell parece limitar la longitud de los enteros, ¿pensé que utilizaba bignums?

La última línea del código funciona bien, lo que me

Cualquier idea rompecabezas? Muchas gracias

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 salida es:

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

Vea también http://stackoverflow.com/questions/3429291/haskell-int-and-integer –

+0

Los tipos son sus amigos. Agregue firmas de tipo, y está claro lo que está pasando! –

Respuesta

10

Su problema es que ord devuelve un Int, que es de ancho fijo. Quiere toInteger $ ord h.

+1

Entonces, ¿hay una diferencia entre un Int y un Entero? – Chris

+2

@Chris Sí, consulte http://www.haskell.org/tutorial/numbers.html – chollida

Cuestiones relacionadas