在Haskell中将文件转换为ByteString文本

7uhlpewt  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(165)

假设我有一个复杂的对象,它是由非平凡操作生成的,我可以将该对象序列化为ByteString,并将该Bytestring写入一个文件,然后打开该文件,并将其反序列化回同一个复杂对象。
现在,我想用Haskell代码对该文件的内容进行硬编码,这样我就可以“打开”该文件,而无需处理IO。
如何将文件的内容转换为ByteString文本?
下面是一个代码示例,可以让事情变得更清楚

someComplicatedObject :: MyDataType
someComplicatedObject = ...

serialized :: ByteString
serialized = serialize someComplicatedObject

serialized_literal :: ByteString
serialized_literal = "...." -- <- what goes here?

main :: IO
main = do
  writeFile "myfile" serialized
  -- at this point, I want to copy the contents of "myfile" and paste it into `serialized_literal`
  fromFile <- readFile "myfile"
  
  -- expect the following to by true
  print $ serialized == fromFile
  print $ fromFile == serialized_literal
gr8qqesn

gr8qqesn1#

最简单的方法可能是使用 template Haskell“嵌入”文件。
例如,可以使用file-embed package。模板Haskell允许您在编译时运行Haskell函数。在这种情况下,**embedFile :: FilePath -> Q Exp**将打开文件并将内容转换为ByteString文本。
因此,您可以使用以下命令运行此命令:

{-# LANGUAGE TemplateHaskell #-}

import Data.FileEmbed(embedFile)
import Data.ByteString

serialized_literal :: ByteString
serialized_literal = $(embedFile "myfile")

文件的内容将被嵌入到可执行文件中,这意味着如果你在编译程序之后修改了myfileserialized_literal仍然会保留你修改文件之前的内容。

相关问题