加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:29:45 所属栏目:Java 来源:网络整理
导读:我正在努力学习 Haskell并努力学习二进制IO. 此代码根据 this answer中给出的代码改编为我之前的一个问题. 我试图从给定的文件中读取很多Word32值和一些Word8值(元数据).目前,我编写了一个程序,只将文件中的Word32值读入未装箱的矢量. 此代码的问题是它在从
我正在努力学习 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读