Haskell Data.Text是否有与Show typeclass等效的类型?

Haskell Data.Text是否有与Show typeclass等效的类型?,haskell,text,typeclass,Haskell,Text,Typeclass,每个人都知道Show。但是关于: class ShowText a where showText :: a -> Text 我到处都找不到这个。为什么?利用Show编写自己的函数很简单: showText :: Show a => a -> Text showText = pack . show 直接创建文本的问题是,在填充之前,您仍然需要知道严格文本块的总体大小。使用生成器方案和Data.Text.Lazy可以做得更好。Dan Doel在bytestring show

每个人都知道
Show
。但是关于:

class ShowText a where
  showText :: a -> Text

我到处都找不到这个。为什么?

利用Show编写自己的函数很简单:

showText :: Show a => a -> Text
showText = pack . show

直接创建文本的问题是,在填充之前,您仍然需要知道严格文本块的总体大小。使用生成器方案和Data.Text.Lazy可以做得更好。Dan Doel在bytestring show中做到了这一点,但我不知道文本有什么等价物。

对于
Int
值的特殊情况,下面的代码可以将它们转换为严格的
文本
值,而无需在中间阶段使用
字符串

import Data.Text
import Data.Text.Lazy (toStrict)
import Data.Text.Lazy.Builder (toLazyText)
import Data.Text.Lazy.Builder.Int (decimal)

showIntegral :: Integral a => a -> T.Text
showIntegral = toStrict. toLazyText . decimal
模块
Data.Text.Lazy.Builder.RealFloat
为浮点值提供了类似的功能

通过这些,我们可以定义自己版本的
Show
typeclass:

import Data.Text
import Data.Text.Lazy (toStrict)
import Data.Text.Lazy.Builder (toLazyText)
import Data.Text.Lazy.Builder.Int (decimal)
import Data.Text.Lazy.Builder.RealFloat (realFloat)

class ShowText a where
    showText :: a -> Text

instance ShowText Int where
    showText = toStrict . toLazyText . decimal

instance ShowText Float where
    showText = toStrict . toLazyText . realFloat
然后,我们可以开始添加更多实例(例如,一个用于元组的实例将非常有用)。

该库现在已经存在,并且正好解决了这个问题

更新(2016年2月12日)

库中提供的
show
功能也可直接呈现文本:

show :: Show a => a -> Text
basic prelude
的依赖项也比
text show
少。如果要使用
basic prelude
,请在源文件的顶部添加以下内容,以避免编译时遇到的麻烦:

{-# LANGUAGE NoImplicitPrelude #-} 
在和中都有一个
tshow
功能

tshow :: Show a => a -> Text

如果您使用的是标准前奏曲,请尝试。

这首歌是否有表演效果?i、 例如,我是不是创建了一个大的
字符串
,然后将其转换为
文本
,而不是直接创建
文本
?这样你就不会失去使用数据的所有好处。文本是这样的吗?您使用文本主要是因为
String
的预浪漫问题,这样您就可以抛开所有的收益…鉴于
Show
typeclass基本上只需要
Show::a->String
,没有字符串就无法实现
showText
。基本和经典前奏曲中的
tshow
函数也是这样实现的。。。对于给定的数据类型,一对(“可能失败的读取函数”、“显示函数”)可以从Control.Lens转换成棱镜吗?是的!你需要能够运行
读取
并找出它是否匹配,这是最近才添加到base中的