Haskell无法与实际类型“字符”匹配的预期类型'字符串'
我想知道为什么我得到这个错误。这是一个任务,我要从一个整数转换为十六进制值。当我将整数值修改为16
时,我称这种帮助器转换函数。 (结合一个整数值,然后我通过16
在递归调用划分)Haskell无法与实际类型“字符”匹配的预期类型'字符串'
这里是我的代码:
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 -> ...
...
好吧,这是我的想法,但然后我得到一个错误,在我的主要功能说'不能匹配预期类型'字符'实际类型字符'“。很奇怪,我没有在任何地方提到Char ... – 2013-02-19 02:29:00
@johnstamos:'String'是根据'Char'定义的,因为'type String = [Char]'。 – 2013-02-19 02:30:33
你能发布整个错误消息吗? – 2013-02-19 03:30:33