Everyone knows Show
. But what about:
class ShowText a where
showText :: a -> Text
I can't find this anywhere. Why?
直接创建文本的问题是您仍然需要在填充严格文本块之前知道其整体大小。您可以使用 Builder 方案并使用 Data.Text.Lazy 做得更好。Dan Doel 在 bytestring-show 中执行此操作,但我不知道 Text 的等效项。
图书馆text-show现在存在并解决了这个问题。
更新(2016 年 2 月 12 日)
basic-preludeshow
库中提供的函数也直接呈现为文本:
show :: Show a => a -> Text
basic-prelude
依赖项也比text-show
. 如果您想使用basic-prelude
,请通过将以下内容添加到源文件的顶部来省去编译的麻烦:
{-# LANGUAGE NoImplicitPrelude #-}
对于Int
值的特殊情况,以下是将它们转换为严格Text
值而不Strings
在中间阶段使用的代码:
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
:
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
然后我们可以开始添加更多实例(例如,一个用于元组的实例很有用)。
编写自己的函数搭载功能很简单Show
:
showText :: Show a => a -> Text
showText = pack . show
在basic-prelude和classy-prelude中现在都有一个tshow
功能。
tshow :: Show a => a -> Text
如果您使用的是标准前奏,请尝试使用text-show 库。