Мутировать только фокус Store Comonad?
Я использую Control.Comonad.Representable.Store для представления объекта сетки для игры; сетка это: type Grid = Store (Compose Vector Vector) a
; где Vector имеет представительный экземпляр, проиндексированный Int
,
Это позволяет мне использовать comonadic extend
а также experiment
для квадратов сетки, чтобы взаимодействовать со своими соседями, и для меня, чтобы использовать фокус монады Store (обозначается как pos
) как курсор в сетку.
То, что я ищу, - это разумный способ установить значение в фокусе магазина или использовать Representable
экземпляр Compose Vector Vector
установить / изменить значения по заданному индексу. Насколько я могу судить, используя инструменты в Comonad
а также Representable
Я могу только получить значения из структуры, я не могу найти такую функцию, как: over :: ComonadStore s w => (a -> a) -> w a -> w a
или даже Representable f => set :: f a -> Rep f -> a -> f a
,
Конечно, я могу индексировать по векторам, корректировать значение, а затем возвращать его в индекс; или даже использовать tabulate
восстановить структуру, но с внесенными корректировками, но они звучат неэффективно и неэффективно. Кажется, что некоторая комбинация этих классов типов могла бы сделать это для меня; или если есть какой-то другой класс ограничений / типов, который я пропускаю, который мог бы помочь здесь.
Спасибо!