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

时间:2015-09-17 09:41:09

标签: haskell vector io binary

我正在努力学习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网站上的文档的指针,该网站上有很多文本,几乎没有工作示例。

1 个答案:

答案 0 :(得分:7)

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

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