Я пишу код (сэмплер MCMC Metropolis-Hastings), который будет использовать генератор случайных чисел и на его основе изменять массив и, возможно, другие структуры.
Моя первоначальная идея состояла в том, чтобы использовать монаду ST, чтобы я мог использовать массивы ST и пакет mersenne-random-pure64, сохраняя генератор PureMT как часть состояния.
Однако я хочу иметь возможность разделить часть работы на отдельные вспомогательные функции (например, для выборки случайного целого числа в заданном диапазоне, для обновления структуры массива и, возможно, более сложных вещей). Для этого, я думаю, мне нужно было бы передать ссылки на генерацию PureMT и массив всем функциям, что может быстро стать очень уродливым, если мне нужно сохранить больше состояний.
Мой инстинкт состоит в том, чтобы сгруппировать все состояние в один тип данных, к которому я могу получить доступ где угодно, как я бы использовал монаду состояния, определяя новый тип данных, но я не знаю, возможно ли это с монадой ST или правильный способ сделать это.
Есть ли какие-нибудь хорошие шаблоны для подобных вещей? Я хочу, чтобы вещи были как можно более общими, потому что мне, вероятно, нужно будет добавить дополнительное состояние и построить более монадический код вокруг существующих частей.
Я попытался найти примеры кода монады ST, но, похоже, он не охвачен в Real World Haskell, а примеры вики haskell очень короткие и простые.
Благодарность!