对具有10位或更多位数的数字进行加扰数字转换

enr*_*que 1 haskell

这是一段相当简单的代码.它需要一个整数并使用商和余数分解其十进制数字.在每次调用时,它会打印一行r字符'I',其中r是最后一位数字,然后用商作为新参数调用自身.

decToUnary 0 = return ()
decToUnary n = let (q, r) = quotRem n 10 in 
    do  
      putStrLn (take r "IIIIIIIIII")
      decToUnary q
Run Code Online (Sandbox Code Playgroud)

它适用于少于10位数的数字,但对于10位或更多位数字,它会对输出进行加扰.我做错了什么,为什么这样做?以下是输出的一些示例,第一个是正确的,第二个是错误的:

*Main> decToUnary 5432
II
III
IIII
IIIII

*Main> decToUnary 5432101234
IIIIIIII
III
IIIIIIIII
III
III
I
IIIIIII
III
I
I
Run Code Online (Sandbox Code Playgroud)

dav*_*420 13

这是一个整数溢出问题.maxBound :: Int是2147483647(在32位机器上),因此值大于溢出.

使用Integer而不是Int:Integer不是固定长度的整数,所以它不会溢出.

编辑:作为应用笔记,您将需要替换take r "IIIIIIIIII"with take (fromIntegral r) "IIIIIIIIII"genericTake r "IIIIIIIIII"; 我更喜欢genericReplicate r 'I'.

genericTake并且genericReplicate都在Data.List中.