私はちょうどこのコードを書いた:
(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
適合しないようです。これはモナドの良いケースですか?(理論的な観点から、複数のインスタンスを1つに結合する方法をどのように定義するかわかりませんが、おそらくそれは実際のアプリケーションを変更しません-モナドが他の場所で解決するような問題のように見えます。持ち運び可能)。
(ps乱数について言及しましたが、質問とは関係のない理由で、これを舞台裏で可変状態を使用するソリューションに置き換えることはできません-「通常の」ランダムルーチンが行うように)。