Я пытаюсь написать программу MCMC на основе алгоритма Метрополиса в Haskell, и у меня возникают проблемы с выборкой из вероятностных распределений (генерация псевдослучайных чисел) и структурированием программы. На данный момент я доволен использованием генератора с жестко запрограммированным начальным числом, чем иметь дело со сложностью работы с вводом-выводом.
Кажется, что я должен использовать монаду состояния, чтобы отслеживать состояние случайного генератора, предыдущее состояние цепи Маркова, значение хи-квадрат и количество приемок между каждым шагом алгоритма, а затем, наконец, собрать все состояния цепи Маркова и последнее принятие считать. Это лучший/идиоматический способ сделать это? и если да, то каким должен быть макет программы (например, тип подписи функции предложения и функции шага города и т. д.).
Я видел несколько примеров программ, которые имеют дело со случайными числами, где список случайных чисел определенной длины генерируется из какой-то вероятностной монады, а затем обрабатывается некоторыми простыми функциями для выполнения вычислений. Я действительно хотел бы избежать этой вывернутой наизнанку формы программы, если это возможно.
Редактировать: Временно удален WIP-код.