4

Haskell新手在这里。

$ ghc --版本
Glorious Glasgow Haskell 编译系统,版本 6.12.1

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

import System.IO
main = do
  print localeEncoding

但它失败了:

$ ghc -o printlocale main.hs
main.hs:4:2:
    没有(显示文本编码)的实例
      因在 main.hs:4:2-21 使用“打印”而产生
    可能的解决方法:为 (Show TextEncoding) 添加一个实例声明
    在表达式中:打印 localeEncoding
    在表达式中:do { print localeEncoding }
    在 `main' 的定义中: main = do { print localeEncoding }

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

4

1 回答 1

5

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

localeEncoding :: TextEncoding

并且 TextEncoding 不是 Show 的一个实例。

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

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

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

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

mkTextEncoding "UTF-8" 

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

于 2010-07-24T20:05:10.147 回答