假设我需要在文件中多次写入/读取“%Y-%m-%d%H:%M:%S”格式的Data.Time.UTCTime
。
在我看来,使用Data.Time.formatTime
或Data.Time.parseTime
将UTCTime
转换为String
,然后将String
打包/解包到/来自ByteString
,因为它涉及中间String
,所以会太慢。但是,手动编写ByteString
UTCTime
构建器/解析器似乎重复了formatTime
和parseTime
中已完成的大量工作。
我想我的问题是:是否有一种系统的方法可以将t -> String
或String -> t
类型的函数转换为t -> ByteString
或ByteString -> t
,效率更高,而不会重复很多工作?
我完全是一名Haskell新手,所以如果问题很愚蠢,请原谅我。
答案 0 :(得分:4)
不,没有将t -> String
类型的函数转换为类型t -> ByteString
的函数的一般方法。如果您记得ByteString不仅仅是一个更快的String
,它可能会帮助您调和自己与现实的关系;它低于那个水平。 ByteString
是一个字节序列;除非你考虑到编码,否则它没有任何意义。
所以你的选择是:
使用函数组合,如phg的答案:
import Data.ByteString.Char8 as B
timeToByteStr :: UTCTime -> ByteString
timeToByteStr = B.pack . formatTime'
parseBStrTime :: ByteString -> Maybe UTCTime
parseBStrTime = parseTime' . B.unpack
我已经更正了函数名称。我也使用了例如parseTime而不是parseTime来忽略你需要传入的格式字符串和TimeLocale
。
(值得注意的是,Data.Text
通常是比Data.ByteString.Char8
更好的选择。后者只有在Char
符合Unicode代码0-255的情况下才能正常工作。)< / p>
如果性能存在问题且此转换成为瓶颈,请编写解析器/构建器。
String
s。最后一个选项是Haskell新手恕我直言的低估选择。 String
在性能方面不是最理想的,但它并不是魔鬼产生的。如果您刚开始使用Haskell,为什么不尽可能简化您的生活,除非您的代码变得太慢?
答案 1 :(得分:-3)
如果您真的不需要大量优化的代码,通常最简单的方法是使用函数组合:
timeToByte = toBytes . formatTime
byteToTime = parseTime . fromBytes
或类似的东西,因为我不熟悉这些库。
如果在分析后你发现这种方法仍然很慢,我想你必须手工写一些东西。