Haskell:打印TextEncoding

Haskell新手在这里。

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

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

import System.IO
main = do
  print localeEncoding

但它失败了:

$ 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让我失望。 我错过了什么?


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

localeEncoding :: TextEncoding

而TextEncoding不是Show的一个实例。

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

data TextEncoding
  = forall dstate estate . TextEncoding  {
    mkTextDecoder :: IO (TextDecoder dstate),
    mkTextEncoder :: IO (TextEncoder estate)
  }

由于这些都是功能,所以没有明智的方法来展示它们。 当前的localeEncoding是使用iconv通过C函数nl_langinfo确定的。

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

mkTextEncoding "UTF-8" 

我们可能会考虑使用TextEncoding来存储语言环境表示的功能请求,因此可以打印此标签。 但是,目前这是不可能的。

链接地址: http://www.djcxy.com/p/33213.html

上一篇: Haskell: print TextEncoding

下一篇: Weakening vinyl's RecAll constraint through entailment