我正在努力学习Haskell并努力学习二进制IO。 此代码根据this answer中给出的代码改编为我之前的一个问题。
我正在尝试从给定文件中读取大量Word32
值和一些Word8
值(元数据)。目前,我编写的程序只是将文件中的Word32
值读入未装箱的矢量。
此代码的问题在于它从文件中读取多个replicateM
值时使用列表(通过Word32
)。我想摆脱中间列表(出于效率原因),并希望使用ByteString直接在文件的向量中读取数据。
这是我完整的工作代码。
import Data.Word
import qualified Data.ByteString.Lazy as BIN
import Data.Binary.Get
import Data.Binary.Put
import qualified Data.Vector.Unboxed as V
import Control.Monad
import System.IO
main = do
h_in <- openFile "dat.bin" ReadMode
v <- readInVector 10 h_in
putStrLn (show v)
hClose h_in
readInVector n h_in = do
bin1 <- BIN.hGet h_in (n*100)
let ints1 = runGet (replicateM n getWord32le) bin1
let v = V.fromList (ints1) :: V.Vector Word32
return v
怎么做?我希望有一个完整的工作代码作为答案,而不只是指向Haskell网站上的文档的指针,该网站上有很多文本,几乎没有工作示例。
答案 0 :(得分:7)
vector
- 包对于向量有自己的replicateM
函数,您可以使用它直接初始化向量而不构建中间列表。
readInVector n h_in = do
bin1 <- BIN.hGet h_in (n*100)
return $ runGet (V.replicateM n getWord32le) bin1