如何在 Haskell 中将索引转换为可变数组的状态引用



我正在重新编码游戏,我问了一个问题,"我怎样才能像二维数组一样迭代四重链接的二维数据网格?",在 Haskell 中。

为了首先创建数据网格,我使用了一种非常命令式的样式算法,如下所示。它所依赖的关键功能是我可以将索引放入数组并从中创建引用。例如,"&array[x][y]"。

我需要能够将索引放入可变数组中,并在 Haskell 中对其进行状态引用。因此,类型签名可能是

convertToSTRef :: i -> STArray s i a -> ST s (STRef s a)

我已经查看了文档,尝试了hoogle和hayoo,但没有找到完成此操作的方法。

附言:或者,如果有人有我可以使用的不同算法,那就太好了。

附言简单的命令式算法。

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;
 }

可以用游标表示"指针",即包含数组引用和偏移量的数据结构。

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

GHC中,不可能指向垃圾收集物体的内部。 垃圾回收器无法理解此类指针。 如果垃圾回收器移动了数组,则垃圾回收器无法相应地更新此类指针。 如果为垃圾回收器提供了指向数组中间的指针,则它无法扫描整个数组,因为它找不到数组的开头。

最新更新