是否有相当于Data.Text的Show类型类?

时间:2012-06-11 22:15:02

标签: haskell text typeclass

每个人都知道Show。但是怎么样:

class ShowText a where
  showText :: a -> Text

我无处可寻。为什么呢?

5 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:14)

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

更新(2016年2月12日)

basic-prelude库中提供的show功能也直接呈现为文字:

show :: Show a => a -> Text

basic-prelude的依赖项也少于text-show。如果您想使用basic-prelude,请通过在源文件的顶部添加以下内容来节省编译难题:

{-# LANGUAGE NoImplicitPrelude #-} 

答案 2 :(得分: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

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

答案 3 :(得分:2)

编写自己的函数捎带Show

是微不足道的
showText :: Show a => a -> Text
showText = pack . show

答案 4 :(得分:1)

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

tshow :: Show a => a -> Text

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