2010-07-16 18 views
5

Tôi có một hàm haskell ngắn ở đây nghĩa là phải chuyển đổi "ABCDEF" thành 0x41,0x42,0x43,0x44,0x45,0x46 (giá trị ascii của chúng), sau đó nhân chúng lại để nó trở thành 0x4142,4344,4546 nhưng nó dường như hạn chế chiều dài số nguyên - tôi nghĩ haskell đã sử dụng bignums tùy ý?Chức năng Haskell dường như đang hạn chế chiều dài số nguyên - tôi nghĩ nó được sử dụng bignums?

Dòng cuối cùng của mã hoạt động tốt, giải đố cho tôi

Bất kỳ ý tưởng nào? Thanks a lot

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) 

Đầu ra là:

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

Xem thêm http://stackoverflow.com/questions/3429291/haskell-int-and-integer –

+0

Các loại là bạn của bạn. Thêm chữ ký loại, và rõ ràng những gì đang xảy ra! –

Trả lời

10

Vấn đề của bạn là ord trả về một Int, mà chiều rộng cố định. Bạn muốn toInteger $ ord h.

+1

Vì vậy, có một sự khác biệt giữa một Int và một Integer? – Chris

+2

@Chris Có, xem http://www.haskell.org/tutorial/numbers.html – chollida

Các vấn đề liên quan