将Double转换为Data.Text的最简单方法是什么?

时间:2011-06-23 03:10:47

标签: haskell type-conversion

如何将Double转换为Data.Text?

实质上,我有以下代码:

Data.Text.pack $ show 9.0

该代码有一些相当明显的愚蠢。所以我在文档中挖掘并提出了这个:

toStrict $ toLazyText $ realFloat 9.0

这似乎更好,但似乎应该有一个更直接的方法,但我找不到任何类型Double - > Data.Text。这是最好的方法吗?似乎如果我切换到惰性文本我可以避免这种情况,但我还没有做好准备。

任何智慧的话语?

4 个答案:

答案 0 :(得分:5)

您可以使用printf类似套餐text-format

答案 1 :(得分:2)

似乎应该有一个class ShowText a where showT :: a -> Text不是吗?我不是Text的沉重(甚至温和)用户,但是Yesod有一个班级:

class ToMessage a where
    toMessage :: a -> Text

使用String的实例,但您真正想要的是Show a的实例,因此您需要使用不可判定的实例或将其作为其他相同类的实例。很遗憾Haskell不允许你close classes ......

编辑:由于我的观点尚不清楚 - 我认为当你真正想要的是showT = pack . show作为Data.Text导出的函数(为方便起见)时,我认为没有任何价值。但是你真正应该想要的是什么 - Text(通常)用于人类消费,Show实例是相当原始的数据树,主要用于程序员;穿越这两种用途让我感到困惑的是两种利益。

答案 2 :(得分:2)

ClassyPrelude提供了Thomas' previous answer中提到的Show类型类。

请参阅tshowtlshow。后者产生一个懒惰的文本。

请注意,默认实现只是T.fromList . Prelude.show

我建议您阅读the Yesod blog on ClassyPrelude以获取有关该软件包的一般信息。请注意,它不是标准前奏的替代品。

答案 3 :(得分:1)

诙谐的回答:

f :: Double -> Data.Text
f = Data.Text.pack . show

然后你只需使用

f 9.0

不能比那更简洁,对吧?为方便起见,不要害怕推出自己的实用程序方法(尽管它们应该具有比f更多的描述性名称)。如果您认为它通常有用,请联系维护者。

相关问题