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

haskell how to remove list usage from this code?

我正在努力学习 Haskell 并在二进制 IO 方面苦苦挣扎。 此代码改编自 中针对我之前的一个问题给出的代码。

我正在尝试从给定文件中读取很多 Word32 值和一些 Word8 值(元数据)。目前,我编写了一个程序,它只是将文件中的 Word32 值读取到未装箱的向量中。

此代码的问题在于它在从文件读取多个 Word32 值时使用列表(通过 replicateM)。我想摆脱中间列表(出于效率原因)并想使用 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 站点上的文档的指针,该站点有很多文本,几乎没有工作示例。

vector-package 有自己的 replicateM 向量函数,您可以使用它直接初始化向量而无需构建中间列表。

readInVector n h_in = do
  bin1 <- BIN.hGet h_in (n*100)
  return $ runGet (V.replicateM n getWord32le) bin1