正在研究将数字n转换为任何基数b的方法。
代码:
int2Base :: Int -> Int -> String
int2Base n b
|n == 0 = "0"
|otherwise = (mod n b) ++ int2Base (div n b) b
和我的错误:
Couldn't match expected type ‘[Char]’ with actual type ‘Int’
In the second argument of ‘mod’, namely ‘b’
In the first argument of ‘(++)’, namely ‘(mod n b)’
这似乎是一个简单的错误,但是即使我将其强制转换为char,它仍然期望'[Char]'而不是[Char]
答案 0 :(得分:3)
问题在这里:
(mod n b) ++ int2Base (div n b) b
“(mod n b)”产生一个Int,而不是一个字符串。
这应该解决它:
int2Base :: Int -> Int -> String
int2Base n b
|n == 0 = "0"
|otherwise = show(mod n b) ++ int2Base (div n b) b
答案 1 :(得分:1)
如果您在GHCI中查看++,
Prelude> :t (++)
(++) :: [a] -> [a] -> [a]
因此++只能应用于列表,而[char]是字符列表。
表示如果要将此Int值转换为String / [Char],则可以使用show
Prelude> :t show
show :: Show a => a -> String
此平均节目能够采用“ a”表示的某些类型并返回String。
要解决该错误,您可以使用otherwise = show(mod n b) ++ int2Base (div n b) b
这将确保您将函数类型与字符串列表匹配
int2Base :: Int -> Int -> String
int2Base n b
|n == 0 = ['0']
|otherwise = show(mod n b) ++ int2Base (div n b) b
((我用['0']只是为了说明双引号中的字符串如何保持[字符]类型