fun*_*ial 1 arrays performance haskell functional-programming data-structures
我正在Haskell中编写一个目前有类似数据类型的游戏程序
data World = World {
worldPlayer :: !(IORef GameObject),
worldEntities :: ![IORef GameObject],
...
}
Run Code Online (Sandbox Code Playgroud)
每次更新时,以下更新都会写入播放器IORef:
updatePlayer :: GameObject -> [IORef GameObject] -> IO GameObject
Run Code Online (Sandbox Code Playgroud)
在此函数中,它检查每个对象的碰撞,然后移动播放器.但我希望updatePlayer函数是纯粹的,所以我需要使用不同的数据结构.
最明显的想法是[IORef GameObject]从世界中获取并IO [GameObject]通过调用readIORef每个索引将其转换为a .但这样效率很低.
我发现这样做的另一种可能方法是使用Data.Vector.MVectorand Data.Vector.Generic.unsafeUnfreeze和unsafeFreeze,它们具有O(1)性能worldEntities :: !(MVector (PrimState IO) GameObject).问题是,unsafeUnfreeze和unsafeFreeze对某些数据类型唯一的工作.
我也发现IOArray,所以我可以使用IOArray Int GameObject,但我找不到将IOArrays转换为不可变结构的方法.
最后,我可以做IORef [GameObject]或者IORef (Vector GameObject),但我不确定这会有多高效.
最有效的方法是什么?