无法将预期类型“ [Char]”与实际类型“ Int”匹配

时间:2018-11-20 18:34:48

标签: haskell

正在研究将数字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]

2 个答案:

答案 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']只是为了说明双引号中的字符串如何保持[字符]类型