我想知道为什么我会收到这个错误。这是一个任务,我要从一个整数转换为一个十六进制值。当我将整数值修改为 16
时,我调用此辅助转换函数. (与整数值连接,然后在递归调用中除以 16
)
这是我的代码:
changeToHex :: Integer -> String
--main function
toHex :: Integer -> String
toHex x
|x == 0 = '0'
|x == 1 = '1'
|x == 2 = '2'
|x == 3 = '3'
|x == 4 = '4'
|x == 5 = '5'
|x == 6 = '6'
|x == 7 = '7'
|x == 8 = '8'
|x == 9 = '9'
|x == 10 = 'A'
|x == 11 = 'B'
|x == 12 = 'C'
|x == 13 = 'D'
|x == 14 = 'E'
|x == 15 = 'F'
最佳答案
使用单引号( 'F'
)会给你一个 Char
文字。对于 String
文字,实际上是 Char
的列表值,您应该使用双引号( "F"
)。
自 String
是 [Char]
的别名, 如果你想从 Char
转换到 String
,您可以只包装 Char
在单元素列表中。执行此操作的函数可能如下所示:
stringFromChar :: Char -> String
stringFromChar x = [x]
这通常是内联的,如
(:[])
,相当于 \x -> (x : [])
或 \x -> [x]
.顺便说一句,您可以大大简化您的代码,例如使用
Enum
类型类:toHexDigit :: Int -> Char
toHexDigit x
| x < 0 = error "toHex: negative digit value"
| x < 10 = toEnum $ fromEnum '0' + x
| x < 15 = toEnum $ fromEnum 'A' + x - 10
| otherwise = error "toHex: digit value too large"
更一般地说,任何时候你有这样的功能:
f x
| x == A = ...
| x == B = ...
| x == C = ...
...
您可以使用
case
将其转换为更少重复、更高效的等效项。 :f x = case x of
A -> ...
B -> ...
C -> ...
...
关于string - Haskell 无法将预期类型 'String' 与实际类型 'Char' 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948765/