这是一段相当简单的代码.它需要一个整数并使用商和余数分解其十进制数字.在每次调用时,它会打印一行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中.