Массив или список для RL в Haskell

Я делаю небольшой RL в haskell (с hscurses), и теперь я пишу код, чтобы сделать/распечатать подземелье.

Первое, что я делаю, это создаю список/массив со «стенами»
В python (v3) это будет выглядеть так:

def mk_list(x, y):        
    dungeon = [['#' for j in range(y)] for i in range(x)]

    return dungeon

И это будет напечатано так:

import curses
def print_dungeon(window, x, y, dungeon):
    for i in range(x):
        for j in range(y):
        window.addstr(j, i, dungeon[x][y])
    window.refresh()

Итак, мой вопрос: как я могу сделать это в haskell? Я знаю, что существует модуль Data.Array, но как Я так понимаю, они поддерживают только 2D-массивы.
Также массив должен быть мутабельным, т.к. потом я должен "копать" в нем комнаты и коридоры.

Но мой вопрос также в том, что я должен использовать для этого массивы или список лучше?

Заранее спасибо!


person caffeinated-fox    schedule 08.07.2016    source источник
comment
Как мне спроектировать X? - вопросы, подобные этому, обычно слишком обширны, чтобы получить хорошие ответы на этом сайте. Кроме того, у вас, похоже, есть предположения о том, как это будет работать (массив должен быть изменчивым), которые я не считаю правильными.   -  person Benjamin Hodgson♦    schedule 08.07.2016
comment
Поскольку вы задаете этот вопрос, я рекомендую списки, даже если они неэффективны.   -  person Alec    schedule 08.07.2016
comment
Я лично сделал это с картой, используя пару (координаты) в качестве ключа. Все просто, все, чего нет на карте, это стена или пустой камень, и их легко обновить и свернуть.   -  person David McHealy    schedule 08.07.2016


Ответы (1)


Haskell поддерживает n-мерные массивы:

import Data.Array
import Data.Ix
import Control.Monad

main = do
  let myBounds = ((0,5,10),(7,8,12)) :: ((Int,Int,Int),(Int,Int,Int))
      threeDexample = array myBounds
                        [ (ijk, e) | ijk@(i,j,k) <- range myBounds,
                                     let e = i+j*10+k*100 ]

  forM_ (range myBounds) $ \ijk@(i,j,k) -> do
    putStrLn $ "value at " ++ show ijk ++ " = " ++ show (threeDexample ! ijk)

Для изменения используйте либо Data.Array.MArray, либо ссылку (//).

person ErikR    schedule 08.07.2016