String 哈斯克尔不能';t匹配预期类型';字符串';实际类型为';Char';
我想知道为什么我会犯这个错误。这是一个赋值,我要从一个整数转换成一个十六进制值。当我将整数值修改为String 哈斯克尔不能';t匹配预期类型';字符串';实际类型为';Char';,string,haskell,char,String,Haskell,Char,我想知道为什么我会犯这个错误。这是一个赋值,我要从一个整数转换成一个十六进制值。当我将整数值修改为16时,我调用这个helper转换函数。(与整数值连接,然后在递归调用中除以16) 这是我的代码: changeToHex :: Integer -> String --main function toHex :: Integer -> String toHex x |x == 0 = '0' |x ==
16
时,我调用这个helper转换函数。(与整数值连接,然后在递归调用中除以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
文本。对于字符串
文本,实际上是字符
值的列表,应该使用双引号(“F”
)
由于String
是[Char]
的别名,如果要将Char
转换为String
,只需将Char
包装在一个元素列表中即可。执行此操作的函数可能如下所示:
stringFromChar :: Char -> String
stringFromChar x = [x]
这通常是内联编写的,如(:[])
,相当于\x->(x:[])
或\x->[x]
另一方面,您可以大大简化代码,例如使用Enum
typeclass:
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"
使用case
,您可以将其转换为重复性更小、效率更高的等价物:
f x = case x of
A -> ...
B -> ...
C -> ...
...
好的,这就是我所想的,但是我在主函数中得到一个错误,说“无法将预期的类型‘Char’与实际的类型‘String’匹配”。奇怪的是,我没有在任何地方提到Char…@johnstamos:
String
是根据Char
定义的,即type String=[Char]
。你能发布整个错误消息吗?
f x = case x of
A -> ...
B -> ...
C -> ...
...