将Data.Time.UTCTime转换为/从ByteString转换

时间:2012-09-04 17:01:47

标签: haskell bytestring

假设我需要在文件中多次写入/读取“%Y-%m-%d%H:%M:%S”格式的Data.Time.UTCTime

在我看来,使用Data.Time.formatTimeData.Time.parseTimeUTCTime转换为String,然后将String打包/解包到/来自ByteString,因为它涉及中间String,所以会太慢。但是,手动编写ByteString UTCTime构建器/解析器似乎重复了formatTimeparseTime中已完成的大量工作。

我想我的问题是:是否有一种系统的方法可以将t -> StringString -> t类型的函数转换为t -> ByteStringByteString -> t,效率更高,而不会重复很多工作?

我完全是一名Haskell新手,所以如果问题很愚蠢,请原谅我。

2 个答案:

答案 0 :(得分:4)

不,没有将t -> String类型的函数转换为类型t -> ByteString的函数的一般方法。如果您记得ByteString不仅仅是一个更快的String,它可能会帮助您调和自己与现实的关系;它低于那个水平。 ByteString是一个字节序列;除非你考虑到编码,否则它没有任何意义。

所以你的选择是:

  1. 使用函数组合,如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>

  2. 如果性能存在问题且此转换成为瓶颈,请编写解析器/构建器。

  3. 只需使用String s。
  4. 最后一个选项是Haskell新手恕我直言的低估选择。 String在性能方面不是最理想的,但它并不是魔鬼产生的。如果您刚开始使用Haskell,为什么不尽可能简化您的生活,除非您的代码变得太慢?

答案 1 :(得分:-3)

如果您真的不需要大量优化的代码,通常最简单的方法是使用函数组合:

timeToByte = toBytes . formatTime
byteToTime = parseTime . fromBytes

或类似的东西,因为我不熟悉这些库。

如果在分析后你发现这种方法仍然很慢,我想你必须手工写一些东西。