【问题标题】:Haskell: print TextEncodingHaskell:打印文本编码
【发布时间】:2010-07-24 19:19:01
【问题描述】:

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

【问题讨论】:

  • GHC 7.0 及更高版本有一个Show TextEncoding 实例。

标签: haskell localization locale ghc


【解决方案1】:

要在 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 存储区域设置表示的功能请求,因此可以打印此标签。但是,目前这是不可能的。

【讨论】:

  • 所以,我根本没有办法打印它?那我应该怎么调试呢?
  • 你想调试什么?打印 TextEncoding 数据类型不会告诉您任何有趣的事情。您是否正在尝试找出您当前的语言环境?
  • 我正在调试的程序在某处丢失了正确的语言环境(它在 Haskell 上并产生另一个 Haskell 编写的程序),并抛出一个异常,它试图从输入中读取错误的字节。跨度>
  • 我已经通过升级到将所有输入都视为 UTF-8 的新版本程序来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 2016-07-07
相关资源
最近更新 更多