Ste*_*lus 1 arrays state haskell functional-programming mutable
我正在重新编写游戏,我问了一个问题," 我如何迭代四重链接的二维数据网格,好像它是一个二维数组? ",适用于Haskell.
为了首先创建数据网格,我使用了一种非常命令式的算法,如下所示.它依赖的关键特性是我可以将索引转换为数组并从中创建引用.例如,"&array [x] [y]".
我需要能够将索引转换为可变数组,并在Haskell中从中生成状态引用.因此类型签名可能是
convertToSTRef :: i -> STArray s i a -> ST s (STRef s a)
Run Code Online (Sandbox Code Playgroud)
我查看了文档,尝试过hoogle和hayoo,但没有找到完成此任务的方法.
PS或者,如果某人有我可以使用的不同算法,那就太棒了.
PSS简单的命令式算法.
const size_t rows = 20;
const size_t columns = 59;
block tiles[columns][rows];
block * const start = &tiles[columns/2][rows/2];
for (size_t x = 0; x < columns; ++x)
for (size_t y = 0; y < rows; ++y)
{
tiles[x][y].floor = '^';
tiles[x][y].inhabitant = WALL;
tiles[x][y].side_block[EAST] = (x + 1 < columns) ? &tiles[x + 1][y] : NULL;
tiles[x][y].side_block[SOUTH] = (y + 1 < rows) ? &tiles[x][y + 1] : NULL;
tiles[x][y].side_block[WEST] = (x > 0) ? &tiles[x - 1][y] : NULL;
tiles[x][y].side_block[NORTH] = (y > 0) ? &tiles[x][y - 1] : NULL;
}
Run Code Online (Sandbox Code Playgroud)
您可以通过游标表示"指针",即包含数组引用和偏移量的数据结构.
data Cursor t i a = Cursor (t i a) i
makeCursor :: STArray s i a -> i -> Cursor (STArray s) i a
makeCursor = Cursor
readCursor :: Ix i => Cursor (STArray s) i a -> ST s a
readCursor (Cursor arr i) = readArray arr i
writeCursor :: Ix i => a -> Cursor (STArray s) i a -> ST s ()
writeCursor x (Cursor arr i) = writeArray arr i x
Run Code Online (Sandbox Code Playgroud)
无法指向GHC中垃圾收集对象的内部.垃圾收集器无法理解这样的指针.如果垃圾收集器移动了一个数组,则垃圾收集器无法正确更新这些指针.如果为垃圾收集器指定了一个指向数组中间的指针,它就无法扫描整个数组,因为它无法找到数组的开头.
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |