Я создаю код, чтобы понять, на самом деле решатель пасьянса. У меня есть простая реализация грубой силы, которая использует монаду состояния, на самом деле просто чтобы доказать, что я могу ее использовать (она только ведет счет каждого оцененного хода). Но теперь я хочу использовать неупакованные изменяемые массивы для записи посещенных досок и, таким образом, быстрой оценки путей, когда я достигаю позиции платы, которая уже была посещена по другому пути. Кажется, что монада ST не позволяет мне распределять неявное состояние, но я должен использовать ST (или IO), чтобы получить доступ к изменяемому массиву. Итак, кажется, я должен объединить две монады - State, чтобы распределять состояние (которое фактически будет включать в себя изменяемый массив), и еще одну (ST), чтобы получить функции изменяемого массива.
- Это правильно?
- И если да, то есть ли лучшая альтернатива, чем (каноническая?) Комбинация Data.Array.ST/Control.Monad.ST/Control.Monad.ST и mtl?
- Если я пойду по этому пути, имеет ли значение, в каком порядке я складываю ST и State?
- Следует ли мне рассмотреть возможность создания моей собственной монады, основанной на одном или обоих ST или State, чтобы избежать использования преобразователей монад?