haskell如何从此代码中删除列表用法?

mnt*_*123 3 io binary haskell vector

我正在努力学习Haskell并努力学习二进制IO.此代码改编自我之前的一个问题的答案中给出的代码.

我试图从给定的文件中读取很多Word32值和一些Word8值(元数据).目前,我编写的程序只是将Word32文件中的值读入未装箱的矢量.

此代码的问题在于它replicateMWord32从文件中读取多个值时使用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网站上的文档的指针,该网站有很多文本,几乎没有工作示例.

sha*_*ang 7

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)