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

标签 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'

最佳答案

使用单引号( '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 -> ...
  ...

关于string - Haskell 无法将预期类型 'String' 与实际类型 'Char' 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948765/

相关文章:

arrays - 如何在Kotlin中将String转换为String数组?

Javascript,没有三元运算符的字符串连接

c# - 从字符串列表中选择随机字符串的更好方法

haskell - 具有Gloss lib的Haskell代码无法编译

c - 如何将ascii符号写入char表?

c++ - Const unsigned char* 到 char*

php - 正则表达式:去除非字母数字或标点符号

list - Haskell 创建数字列表

Java char 数组似乎每个 char 需要超过 2 个字节

haskell - `~`(波浪号)在实例上下文中是什么意思,为什么在某些情况下需要解决重叠问题?