哈斯克尔无法匹配预期的类型“字符串”与实际的类型“字符”(Haskell Couldn't

2019-07-20 03:07发布

我很奇怪,为什么我得到这个错误。 这是一个任务分配时,我是从一个整数转换为十六进制值。 我把这种辅助转换功能,当我由国防部整数值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'

Answer 1:

使用单引号( 'F' )给你一个Char文本。 对于一个String字面,这实际上是列表Char值,你应该使用双引号( "F" )。

由于String是一个别名[Char] ,如果你想从一个转换CharString ,可以只换行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 -> ...
  ...


文章来源: Haskell Couldn't match expected type 'String' with actual type 'Char'