Я только что написал этот код:
(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 я упомянул случайные числа, но я не могу заменить это решением, которое использует изменяемое состояние за кулисами -, как это делают «обычные» случайные процедуры -по причинам, не связанным с вопросом ).