Мутировать только фокус 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 восстановить структуру, но с внесенными корректировками, но они звучат неэффективно и неэффективно. Кажется, что некоторая комбинация этих классов типов могла бы сделать это для меня; или если есть какой-то другой класс ограничений / типов, который я пропускаю, который мог бы помочь здесь.

Спасибо!

0 ответов

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