每个人都知道Show
。但是怎么样:
class ShowText a where
showText :: a -> Text
我无处可寻。为什么呢?
答案 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-prelude和classy-prelude都有tshow
功能。
tshow :: Show a => a -> Text
如果您使用的是标准前奏曲,请尝试text-show library。