如何将Double转换为Data.Text?
实质上,我有以下代码:
Data.Text.pack $ show 9.0
该代码有一些相当明显的愚蠢。所以我在文档中挖掘并提出了这个:
toStrict $ toLazyText $ realFloat 9.0
这似乎更好,但似乎应该有一个更直接的方法,但我找不到任何类型Double - > Data.Text。这是最好的方法吗?似乎如果我切换到惰性文本我可以避免这种情况,但我还没有做好准备。
任何智慧的话语?
答案 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
类型类。
请注意,默认实现只是T.fromList . Prelude.show
。
我建议您阅读the Yesod blog on ClassyPrelude以获取有关该软件包的一般信息。请注意,它不是标准前奏的替代品。
答案 3 :(得分:1)
诙谐的回答:
f :: Double -> Data.Text
f = Data.Text.pack . show
然后你只需使用
f 9.0
不能比那更简洁,对吧?为方便起见,不要害怕推出自己的实用程序方法(尽管它们应该具有比f
更多的描述性名称)。如果您认为它通常有用,请联系维护者。