如何在Haskell中预分配Vector

时间:2015-11-15 19:51:01

标签: haskell

我创建了一个涉及可变图形的应用程序(我需要能够修改彼此引用的对象)。为此,我使用和id并将每个对象存储在Vector中(对象的id是它在向量中的位置)。向量保持在一个状态,并使用状态转换器创建一个新对象。 一切都运行正常,但每个对象的创建都涉及snoc。当我从文件加载所有对象时,这会导致性能下降。有没有办法分配正确大小的向量?我的问题是,我不能使用fromList,因为我只能使用状态monad使用智能构造函数创建对象。

我的代码(简化)如下

data Box = { boxId :: Int , boxName :: String }
data Warehouse = { whBoxes :: Vector Box }

type WH = State Warehouse

newBox :: String -> WH Box
newBox name = do
     warehouse <- get
     let boxes = whBoxes warehouse 
     boxId = Vector.length boxes warehouse
     box = Box boxId name

     put warehouse { whBoxes = boxes `V.snoc` box }
     return box

对于每个新方框,如何只使用newBox而不使用 snocing 读取文件并使用方框填充仓库?

更新

我当前的函数读取一个csv,其中包含该框的名称和相同框的数量(我使用的是木薯)

import qualified Data.Csv as Csv
import qualified Data.ByteString.Lazzy as BL
import qualified Data.Vector as Vec

readBoxes :: String -> IO (WH ())
readBoxes filename = do
    csvData <- BL.readFile filename

    case Csv.decode  Csv.HasHeader csvData of
         Left err ->  do putStrLn err; return (return ())
         Right (rows) -> do
                Vec.forM_ rows $ \(style, qty) ->
                       let types = qty :: Int
                       in forM [1..qty] $   \i -> newBox style

(正如我之前所说,我简化了代码,因此可能无法编译)。

0 个答案:

没有答案