haskell - 将 Data.Time.UTCTime 与 ByteString 相互转换

标签 haskell bytestring

假设我需要写/读 Data.Time.UTCTime以“%Y-%m-%d %H:%M:%S”格式多次往返文件。

在我看来,使用 Data.Time.formatTimeData.Time.parseTime转换 UTCTime往返String然后打包/解包 String往返ByteString , 会太慢,因为它涉及中间 String .但是写一个 ByteString UTCTime 的构建器/解析器|手工操作似乎重复了很多已经在 formatTime 中完成的工作和 parseTime .

我想我的问题是:是否有系统的方法来获取 t -> String 类型的函数?或 String -> t转换为 t -> ByteStringByteString -> t在不重复大量工作的情况下提高效率?

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

最佳答案

不,没有一种通用的方法可以将 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 更好的选择。后者只有在您的 Chars 属于 Unicode 代码点 0-255。)

  2. 如果性能是个问题,并且这种转换被证明是瓶颈,请编写一个解析器/构建器。

  3. 只需使用 String

恕我直言,最后一个选项对于 Haskell 新手来说是一个被低估的选择。 String 在性能方面不是最理想的,但它不是魔鬼的产物。如果您刚刚开始使用 Haskell,为什么不让您的生活尽可能简单,直到并且除非您的代码变得太慢?

关于haskell - 将 Data.Time.UTCTime 与 ByteString 相互转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12268148/

相关文章:

http - ByteString 需要不同的 ByteString

haskell - 通过解析字节流返回类型列表,其中长度直到运行时才知道

haskell - Haskell prelude 函数可以简化为一组核心函数吗?

exception - Haskell 惰性异常——区分多个异常?

haskell - 非平凡仿函数的例子

haskell - 为什么字节串的 Data.Binary 实例添加字节串的长度作为前缀

json - Haskell Aeson json 编码字节串

haskell - 延迟生成随机访问数据结构的最佳技术是什么?

haskell - 平衡括号的秒差距

Haskell, Aeson - (ToJSON ByteString) 没有实例