Haskell无法将预期类型'String'与实际类型'Char'匹配

joh*_*mos 4 string haskell char

我想知道为什么我得到这个错误.它是一个赋值,我将从一个整数转换为十六进制值.当我修改整数值时,我称之为辅助转换函数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'
Run Code Online (Sandbox Code Playgroud)

Jon*_*rdy 10

使用单引号('F')为您提供Char文字.对于String文字,实际上是一个Char值列表,您应该使用双引号("F").

由于String是别名[Char],如果要从a转换Char为a String,则只能将其包装Char在单元素列表中.这样做的功能可能如下所示:

stringFromChar :: Char -> String
stringFromChar x = [x]
Run Code Online (Sandbox Code Playgroud)

这通常是内联编写的(:[]),等同于\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"
Run Code Online (Sandbox Code Playgroud)

更一般地说,只要你有这样的功能:

f x
  | x == A = ...
  | x == B = ...
  | x == C = ...
  ...
Run Code Online (Sandbox Code Playgroud)

您可以将其转换为重复性更低,效率更高的等效项case:

f x = case x of
  A -> ...
  B -> ...
  C -> ...
  ...
Run Code Online (Sandbox Code Playgroud)