Как изменить фокус в Haskell Store Comonad в двухмерном списке

Я борюсь со следующей проблемой. Я пытаюсь сделать Game of Life, используя магазинные комонады в Haskell. У меня есть следующий соответствующий код:

type Cel = ((Float, Float), Bool)
type Field2D = [[Cel]]

Затем я создал начальное поле:

initialField2D = [[((0.0, 0.0), True), ((0.0, 1.0), True)], 
                  [((1.0, 0.0), True), ((1.0, 1.0), True)]]

Начальное поле - небольшой пример, в котором я хочу протестировать свою программу. Теперь здесь начинается сложная часть.

initialStore2D :: Store Field Cel
initialStore2D = Store (head.head) initialField2D

f :: (Store Field2D Cel) -> Cel
f (Store f s) = cellUpdate (f s)

cellUpdate :: Cel -> Cel --Simple trivial cell update function that just moves one spot.
cellUpdate ((x, y), a) = ((x+1, y+1), True)

newStore = extend f initialStore2D -- Apply the update function to every cell.
extract newStore --Correctly returns ((1.0, 1.0), True)

Теперь мой вопрос: как можно изменить фокус на обновленном магазине? Двигаться вниз очень просто:

goDown :: Store Field Cel
goDown (Store f s) = Store (f.tail) s

Мой вопрос в том, что было бы хорошим способом двигаться вправо или влево, например? Я выбрал неверную функцию индекса (head.head)?

Спасибо за ваше время!

0 ответов

Другие вопросы по тегам