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)