将chr的输出格式更改为十六进制

时间:2015-08-26 04:23:31

标签: haskell

假设我有

print [chr 0x49, chr 0x9f]

输出

"I\159"

当打印出必须显示为转义序列的字符时,如何使print使用十六进制数字?所以我的输出显示为:

"I\x9f"

1 个答案:

答案 0 :(得分:8)

简短的回答是你无法改变它。

print xputStrLn (show x)相同,您无法更改show适用于已定义Show实例的类型的方式。

但是,您可以定义自己的格式化功能:

fmtChar :: Char -> String
fmtChar ch = ...

fmtString :: String -> String
fmtString s = "\"" ++ (concatMap fmtChar s) ++ "\""

并在想要查看格式的地方使用它们:

putStrLn $ fmtString [ chr 0x49, chr 0x9f ]

定义fmtChar的一种方式:

import Numeric (showHex)

fmtChar ch =
  if length s == 1
    then s
    else "\\x" ++ showHex (fromEnum ch) ""
  where s = show ch

(注意:Numeric位于base,因此您已拥有它。)