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/