假设我需要写/读 Data.Time.UTCTime
以“%Y-%m-%d %H:%M:%S”格式多次往返文件。
在我看来,使用 Data.Time.formatTime
或 Data.Time.parseTime
转换 UTCTime
往返String
然后打包/解包 String
往返ByteString
, 会太慢,因为它涉及中间 String
.但是写一个 ByteString
UTCTime
的构建器/解析器|手工操作似乎重复了很多已经在 formatTime
中完成的工作和 parseTime
.
我想我的问题是:是否有系统的方法来获取 t -> String
类型的函数?或 String -> t
转换为 t -> ByteString
或 ByteString -> t
在不重复大量工作的情况下提高效率?
我完全是 Haskell 新手,所以如果问题很愚蠢,请原谅我。
最佳答案
不,没有一种通用的方法可以将 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
s 属于 Unicode 代码点 0-255。)如果性能是个问题,并且这种转换被证明是瓶颈,请编写一个解析器/构建器。
- 只需使用
String
。
恕我直言,最后一个选项对于 Haskell 新手来说是一个被低估的选择。 String
在性能方面不是最理想的,但它不是魔鬼的产物。如果您刚刚开始使用 Haskell,为什么不让您的生活尽可能简单,直到并且除非您的代码变得太慢?
关于haskell - 将 Data.Time.UTCTime 与 ByteString 相互转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12268148/