gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:53:48 25 4
gpt4 key购买 nike

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

我正在尝试从给定文件中读取大量 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

关于haskell 如何从此代码中删除列表用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32627147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com