Хороший способ отслеживать несколько ссылок между функциями в монаде ST?

Я пишу некоторый код (семплер MCMC Metropolis-Hastings), который будет использовать генератор случайных чисел и изменять массив и, возможно, другие структуры на основе этого.

Моя первоначальная идея заключалась в том, чтобы использовать монаду ST, чтобы я мог использовать массивы ST и пакет mersenne-random-pure64, сохраняя генератор PureMT как часть состояния.

Однако я хочу иметь возможность отделить часть работа с отдельными вспомогательными функциями (например, для выборки случайного целого числа в заданном диапазоне, для обновления структуры массива и, возможно, более сложных вещей). Для этого, я думаю, мне нужно было бы передать ссылки на генерацию PureMT и массив всем функциям, что могло бы быстро стать очень уродливым, если бы мне нужно было хранить больше состояний.

Мой инстинкт - сгруппировать все состояние в единый тип данных, к которому я могу получить доступ где угодно, как я бы использовал монаду State, определив новый тип данных, но я не знаю, возможно ли это с монадой ST, или как это сделать.

. Есть ли какие-нибудь хорошие шаблоны для подобных вещей? Я хочу, чтобы вещи были как можно более общими, потому что мне, вероятно, нужно будет добавить дополнительное состояние и построить больше монадического кода вокруг существующих частей.

Я попытался найти примеры кода монады ST, но, похоже, он не охвачен Real World Haskell и примеры вики haskell очень короткие и простые.

спасибо!

8
задан Guy Coder 15 December 2013 в 14:20
поделиться