Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 哈斯克尔不能';t匹配预期类型';字符串';实际类型为';Char';_String_Haskell_Char - Fatal编程技术网

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 -> ...
  ...