2010-07-16 5 views
5

Ich habe hier eine kurze Haskell-Funktion, die "ABCDEF" in 0x41,0x42,0x43,0x44,0x45,0x46 (ihre Ascii-Werte) umwandeln soll, dann multipliziere sie so, dass es 0x4142,4344,4546 wird scheint begrenzende Integer-Länge zu sein - ich dachte, Haskell benutzt willkürliche Bignums?Haskell-Funktion scheint begrenzende Integer-Länge zu sein - ich dachte, dass es Bignums verwendet?

Die letzte Zeile des Codes funktioniert gut, die mir ein Rätsel

Irgendwelche Ideen? Vielen Dank

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) 

Die Ausgabe lautet:

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

Siehe auch http://stackoverflow.com/questions/3429291/haskell-int-and-integer –

+0

Typen sind dein Freund. Fügen Sie Signaturen hinzu, und es ist klar, was vor sich geht! –

Antwort

10

Ihr Problem ist, dass ord eine Int zurückgibt, die ist mit fester Breite. Sie wollen toInteger $ ord h.

+1

Also gibt es einen Unterschied zwischen einem Int und einem Integer? – Chris

+2

@Chris Ja, siehe http://www.haskell.org/tutorial/numbers.html – chollida