Haskell新手在这里。

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

While trying to debug weird locale-related bug in third-party Haskell program, I'm trying to print default encoding:

import System.IO
main = do
  print localeEncoding

但它失败了:

$ ghc -o printlocale main.hs
main.hs:4:2:
没有 (Show TextEncoding) 的实例
由在 main.hs:4:2-21 处使用 `print' 引起的
可能的修复:为 (Show TextEncoding) 添加实例声明
在表达式中:print localeEncoding
在表达式中: do { print localeEncoding }
在 `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 存储区域设置表示的功能请求,因此可以打印此标签。然而,这目前是不可能的。

关于Haskell:打印 TextEncoding,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3326506/

10-11 18:34