Я просто написал этот код:Как лучше перебрать государства в Clojure (монады?)
(defn parameters [transform-factory state]
(lazy-seq (let [[r1 state] (uniform state)
[r2 state] (uniform state)
[t state] (transform-factory state)]
(cons [t [r1 r2]] (parameters transform-factory state)))))
(defn repeated-transform [mosaic n transform-factory state]
(reduce transform-square mosaic
(take n (parameters transform-factory state))))
функция parameters
генерирует ленивую последовательность значений, полученных из state
, которые используются параметризировать повторное преобразование что-то («мозаика» в этом случае).
Мне кажется, что parameters
показывает довольно распространенный шаблон, который возникает, когда у вас есть state
, который должен быть перенесен (в данном случае для генерации случайных значений). есть ли название для этого?
есть ли лучший способ написать первую функцию? связанные проблемы могут часто решаться с помощью reduce
, который «переносит» состояние, но здесь мне нечего уменьшать. Аналогично, reductions
, похоже, не подходит. это хороший пример для монады? (из теоретического pov я не вижу, как вы определяете способ объединения нескольких экземпляров в один, но, возможно, это не меняет практическое приложение - похоже, что такие проблемы монады решаются в другом месте, где какое-то государство нуждается в быть перенесенным).
(ps упомянутые случайные числа, но я не могу заменить это решением, которое использует изменчивое состояние за кулисами - как «обычные» случайные подпрограммы - по причинам, не связанным с вопросом).
> (ps упомянутые случайные числа, но я не могу заменить это решением, которое использует изменчивое состояние за кулисами - как «обычные» случайные подпрограммы - по причинам, не связанным с вопросом). Вы можете использовать a) псевдослучайный генератор, несущий семя вокруг, или b) скопируйте изменчивое состояние (чтобы его не изменяли). Я использовал этот подход для реализации [pure mersenne twister] [1]. [1]: http://hackage.haskell.org/package/mersenne-random-pure64-0.2.0.3 –
Я пришел сюда, чтобы задать тот же вопрос – jes5199
@DonStewart - я не понимаю, как это будет измените то, что я прошу. на самом деле то, что я делаю, это копирование состояния - вот что «государство» выше, и источник моих проблем. –