Haskell:打印文本编码

Haskell:打印文本编码,haskell,localization,locale,ghc,Haskell,Localization,Locale,Ghc,哈斯克尔是个新手 $ ghc --version The Glorious Glasgow Haskell Compilation System, version 6.12.1 但它失败了: $ ghc -o printlocale main.hs main.hs:4:2: No instance for (Show TextEncoding) arising from a use of `print' at main.hs:4:2-21 Possible fix:

哈斯克尔是个新手

$ ghc --version The Glorious Glasgow Haskell Compilation System, version 6.12.1 但它失败了:

$ ghc -o printlocale main.hs main.hs:4:2: No instance for (Show TextEncoding) arising from a use of `print' at main.hs:4:2-21 Possible fix: add an instance declaration for (Show TextEncoding) In the expression: print localeEncoding In the expression: do { print localeEncoding } In the definition of `main': main = do { print localeEncoding } $ghc-o printlocale main.hs main.hs:4:2: 没有(显示文本编码)的实例 因在main中使用“print”而产生。hs:4:2-21 可能的修复方法:为(ShowTextEncoding)添加实例声明 在表达式中:print localeEncoding 在表达式中:do{print localeEncoding} 在“main”的定义中:main=do{print localeEncoding}
我的谷歌fu让我失望了。我缺少什么?

要在Haskell中打印某种类型的值,该类型必须是Show类的实例

localeEncoding :: TextEncoding
TextEncoding不是Show的一个实例

TextEncoding类型实际上是存储编码和解码方法的存在类型:

data TextEncoding
  = forall dstate estate . TextEncoding  {
    mkTextDecoder :: IO (TextDecoder dstate),
    mkTextEncoder :: IO (TextEncoder estate)
  }
因为这些都是函数,所以没有合理的方式来显示它们。当前本地编码是通过C函数nl_langinfo使用iconv确定的

因此,文本编码本身不是可显示的类型,因此您无法打印它。但是,您可以通过mktextcodeding构造这种类型的新值。例如,要创建utf8环境:

mkTextEncoding "UTF-8" 

我们可以考虑一个特性请求,用TExpCu码存储区域的表示,这样可以打印这个标签。但是,目前这是不可能的。

所以,我根本没有办法打印它?那我该怎么调试?你想调试什么?打印TextEncoding数据类型不会告诉您任何有趣的事情。你想找出你当前的语言环境吗?我调试的程序在进行中的某个地方丢失了正确的语言环境(它在Haskell上,生成了另一个Haskell编写的程序),并引发一个异常,即它试图从输入中读取错误的字节。我已通过升级到新版本的程序来解决此问题,该程序将所有输入都视为UTF-8.GHC 7.0,并且更高版本有一个
Show textcodeding
实例。
mkTextEncoding "UTF-8"