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