Кажется, функция Haskell ограничивает целочисленную длину - я думал, что она использует bignums? - PullRequest
5 голосов
/ 16 июля 2010

У меня есть короткая функция haskell, которая должна конвертировать "ABCDEF" в 0x41,0x42,0x43,0x44,0x45,0x46 (их значения ascii), затем умножить их так, чтобы они стали 0x4142,4344,4546, но кажется, что это ограничивает целочисленную длину - я думал, что haskell использовал произвольные значения 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 Ответ

10 голосов
/ 16 июля 2010

Ваша проблема в том, что ord возвращает Int, что равно фиксированной ширины.Вы хотите toInteger $ ord h.

...