mnt*_*123 3 io binary haskell vector
我正在努力学习Haskell并努力学习二进制IO.此代码改编自我之前的一个问题的答案中给出的代码.
我试图从给定的文件中读取很多Word32值和一些Word8值(元数据).目前,我编写的程序只是将Word32文件中的值读入未装箱的矢量.
此代码的问题在于它replicateM在Word32从文件中读取多个值时使用list(via ).我想摆脱中间列表(出于效率原因),并希望使用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
Run Code Online (Sandbox Code Playgroud)
这该怎么做?我希望一个完整的工作代码作为答案,而不仅仅是指向Haskell网站上的文档的指针,该网站有很多文本,几乎没有工作示例.
该vector-package有它自己的replicateM,而您可以用它来直接初始化向量没有建立一个中间表的载体功能.
readInVector n h_in = do
bin1 <- BIN.hGet h_in (n*100)
return $ runGet (V.replicateM n getWord32le) bin1
Run Code Online (Sandbox Code Playgroud)