我想知道为什么我收到这个错误。它是一个赋值,我将从一个整数转换为十六进制值。当我通过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'
答案 0 :(得分:9)
使用单引号('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 -> ...
...