haskell - 为什么 unpack 和 show 在 Data.Text 中的定义不同(对于非 ASCII 字符的行为也不同?)

标签 haskell

unpackshow 是将Text 转换为String 的两种方法。但是,对于非 ASCII 字符,它们的行为和定义不同:

Prelude Data.Text> putStrLn $ unpack $ pack "你好我的朋友"
你好我的朋友
Prelude Data.Text> putStrLn $ show $ pack "你好我的朋友"
"\20320\22909\25105\30340\26379\21451"

我相信,show 会返回一串代码点,而 unpack 会显示实际的字符。我发现这在编码时很麻烦,因为我已经定义了采用 Show 实例并希望传入 Text 的函数,并期望它返回实际的非-ASCII 字符作为 String

此行为的设计意图是什么?为什么 showunpack 的定义不同?

来源可以在 http://hackage.haskell.org/packages/archive/text/0.11.1.5/doc/html/src/Data-Text.html 找到.

最佳答案

这是关于 Show 的通用内容:它的目的是生成一种对象的预览,可以兼作可移植序列化,可读性如 Haskell代码。显然,你好我的 friend 不是有效的 Haskell(除非你将它定义为一个变量,实际上你是 can !),所以它不会被接受为show 的输出。如果它产生 "你好我的 friend " 就好了(事实上,我更喜欢那样),但是当你没有完全使用完整的 UTF 时,这可能会导致平台等问题- 8 在您的所有工作链中,因此选择了更安全的 ASCII 扩展。

如果你想要良好的非转义纯字符串输出作为 GHCi 回显,你可以使用 the new custom-pretty-printer feature .我已经写了一些关于那个的东西 here .

关于haskell - 为什么 unpack 和 show 在 Data.Text 中的定义不同(对于非 ASCII 字符的行为也不同?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16874812/

相关文章:

haskell - openSUSE Tumbleweed 上的堆栈设置

Haskell中的随机数列表

haskell - 检查 Haskell 中列表中的所有 bool 元素是否相同

web-services - 如何使用 Yesod 和 Http-Conduit 将 FileInfo 发布到 Web 服务?

haskell - 有没有更好的方法将属性字段添加到 Haskell 的 AST 中?

haskell - 在 Haskell 中根据父关系长出一棵树

haskell - 是否可以编写类型为 Int -> Float 的 Haskell 函数

list - 在 Haskell 中,[0.1..1] 返回 [0.1,1.1]。为什么?

generics - 使用记录 Haskell 进行泛型派生

xml - 有效的 OTRS-TicketSearch 请求的 XML 是什么