Haskell无法与实际类型“字符”匹配的预期类型'字符串'

问题描述:

我想知道为什么我得到这个错误。这是一个任务,我要从一个整数转换为十六进制值。当我将整数值修改为16时,我称这种帮助器转换函数。 (结合一个整数值,然后我通过16在递归调用划分)Haskell无法与实际类型“字符”匹配的预期类型'字符串'

这里是我的代码:

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' 
+0

你能发布整个错误消息吗? – 2013-02-19 03:30:33

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

好吧,这是我的想法,但然后我得到一个错误,在我的主要功能说'不能匹配预期类型'字符'实际类型字符'“。很奇怪,我没有在任何地方提到Char ... – 2013-02-19 02:29:00

+1

@johnstamos:'String'是根据'Char'定义的,因为'type String = [Char]'。 – 2013-02-19 02:30:33