Как лучше перебирать состояние в монаде 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не подходит. это хороший случай для монады? (из теоретической точки зрения я не понимаю, как вы определяете способ объединения нескольких экземпляров в один, но, возможно, это не меняет практического применения -кажется, что монады решают проблемы в другом месте, где какое-то состояние нужно носить с собой ).

(ps я упомянул случайные числа, но я не могу заменить это решением, которое использует изменяемое состояние за кулисами -, как это делают «обычные» случайные процедуры -по причинам, не связанным с вопросом ).

7
задан andrew cooke 26 April 2012 в 18:54
поделиться