28

Everyone knows Show. But what about:

class ShowText a where
  showText :: a -> Text

I can't find this anywhere. Why?

4

5 回答 5

15

直接创建文本的问题是您仍然需要在填充严格文本块之前知道其整体大小。您可以使用 Builder 方案并使用 Data.Text.Lazy 做得更好。Dan Doel 在 bytestring-show 中执行此操作,但我不知道 Text 的等效项。

于 2012-06-11T23:57:17.250 回答
14

图书馆text-show现在存在并解决了这个问题。

更新(2016 年 2 月 12 日)

basic-preludeshow库中提供的函数也直接呈现为文本:

show :: Show a => a -> Text

basic-prelude依赖项也比text-show. 如果您想使用basic-prelude,请通过将以下内容添加到源文件的顶部来省去编译的麻烦:

{-# LANGUAGE NoImplicitPrelude #-} 
于 2014-11-17T05:20:44.433 回答
5

对于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

然后我们可以开始添加更多实例(例如,一个用于元组的实例很有用)。

于 2013-08-15T09:16:10.087 回答
2

编写自己的函数搭载功能很简单Show

showText :: Show a => a -> Text
showText = pack . show
于 2012-06-11T22:31:04.693 回答
1

basic-preludeclassy-prelude中现在都有一个tshow功能。

tshow :: Show a => a -> Text

如果您使用的是标准前奏,请尝试使用text-show 库

于 2017-08-14T11:51:30.547 回答