Haskell:打印TextEncoding

Ale*_*ysh 4 locale haskell localization ghc

Haskell新手在这里.

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.12.1

在尝试调试第三方Haskell程序中与奇怪的与语言环境相关的错误时,我正在尝试打印默认编码:

import System.IO
main = do
  print localeEncoding
Run Code Online (Sandbox Code Playgroud)

但它失败了:

$ 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 }

我的google-fu让我失望了.我错过了什么?

Don*_*art 5

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

localeEncoding :: TextEncoding
Run Code Online (Sandbox Code Playgroud)

和TextEncoding不是Show的实例.

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

data TextEncoding
  = forall dstate estate . TextEncoding  {
    mkTextDecoder :: IO (TextDecoder dstate),
    mkTextEncoder :: IO (TextEncoder estate)
  }
Run Code Online (Sandbox Code Playgroud)

由于这些是功能,因此没有明智的方式来展示它们.当前的localeEncoding是使用iconv通过C函数nl_langinfo确定的.

因此,TextEncoding本身不是可显示的类型,因此您无法打印它.但是,您可以通过mkTextEncoding构造此类型的新值.例如,创建一个utf8环境:

mkTextEncoding "UTF-8" 
Run Code Online (Sandbox Code Playgroud)

我们可能会考虑使用TextEncoding存储区域设置表示的功能请求,因此可以打印此标签.但是,目前这是不可能的.