2010-07-16 23 views
5

मुझे यहां एक छोटा सा हैकेल फ़ंक्शन मिला है जिसे "एबीसीडीईएफ" को 0x41,0x42,0x43,0x44,0x45,0x46 (उनके एसीआईआई मान) में परिवर्तित करना है, फिर उन्हें गुणा करें ताकि यह 0x4142,4344,4546 हो जाए लेकिन यह लगता है कि पूर्णांक लंबाई सीमित है - मैंने सोचा था कि हैकेल मनमाने ढंग से bignums इस्तेमाल किया?हास्केल फ़ंक्शन पूर्णांक लंबाई सीमित कर रहा है - मैंने सोचा कि यह bignums का उपयोग किया?

कोड की अंतिम पंक्ति ठीक काम करता है, जो मुझे

कोई भी विचार पहेली? धन्यवाद एक बहुत

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) 

उत्पादन होता है:

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

यह भी देखें http://stackoverflow.com/questions/3429291/haskell-int-and-integer –

+0

प्रकार आपके मित्र हैं। प्रकार हस्ताक्षर जोड़ें, और यह स्पष्ट है कि क्या हो रहा है! –

उत्तर

10

आपका समस्या यह है कि ord रिटर्न एक Int है, जो निश्चित-चौड़ाई है। आप toInteger $ ord h चाहते हैं।

+1

तो इंट और इंटीजर के बीच कोई अंतर है? – Chris

+2

@ क्रिस हां, देखें http://www.haskell.org/tutorial/numbers.html – chollida

संबंधित मुद्दे