2012-04-18 44 views
1

我正在重新編寫遊戲,我在Haskell問了一個問題「How can I iterate over a quadruple linked 2-dimensional grid of data as if it were a 2-dimensional array?」。如何將索引轉換爲可變數組並將其轉換爲Haskell中的狀態引用?

爲了首先創建數據網格,我使用了一個非常必要的樣式算法,如下所示。它依賴的關鍵特性是我可以將索引放入數組中並從中創建一個參考。例如,「& array [x] [y]」。

我需要能夠索引到一個可變數組中,並在Haskell中創建一個狀態引用。因此,該類型簽名可能是

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

我已經看過的文件過來,都嘗試hoogle和hayoo,並沒有找到一種方法來做到這一點。

P.S.或者,如果有人使用了我可以使用的不同算法,那就太好了。

P.S.S.簡單的命令式算法。

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

您是否需要在稍後的時間更改這些參考文獻指向的位置?如果沒有,則根本不需要存儲它們,而只需使用函數'sideBlock :: Direction - >(Int,Int) - > Maybe(Int,Int)'來代替。 – hammar 2012-04-18 21:13:50

回答

5

可以代表一個「指針」通過光標,即,包含一個數組引用和偏移量的數據結構。

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中垃圾收集對象的內部是不可能的。垃圾回收器不能理解這樣的指針。如果數組由垃圾收集器移動,則垃圾收集器無法正確更新這些指針。如果給垃圾收集器一個指向數組中間的指針,它將無法掃描整個數組,因爲它找不到數組的開頭。

+0

我想過只是將索引存儲到數組中,但它更合乎邏輯(您的想法),將指針一起存儲到數組和索引。 – 2012-04-18 21:16:19

相關問題