Ho appena scritto questo codice:Come iterare meglio nel corso Stato in Clojure (Monade?)
(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))))
la funzione parameters
genera una sequenza pigro di valori generati dal state
, che vengono utilizzati per parametrizzare una trasformazione ripetuto di qualcosa (un "mosaico" in questo caso).
mi sembra che parameters
mostri uno schema abbastanza comune che emerge quando si dispone di un po 'di state
che deve essere portato in giro (in questo caso per generare valori casuali). C'è un nome per questo?
c'è un modo migliore per scrivere la prima funzione? problemi correlati possono spesso essere risolti con reduce
, che "porta avanti" lo stato, ma qui non ho nulla da ridurre. allo stesso modo, reductions
non sembra adattarsi. questo è un buon caso per una monade? (da un pov teorico non vedo come tu definisca un modo per combinare più istanze in una, ma forse non cambia l'applicazione pratica - sembra il tipo di problema che le monadi risolvono altrove, dove alcuni stati devono essere portato in giro).
(ps ho menzionato i numeri casuali, ma non posso sostituirlo con una soluzione che utilizza lo stato mutevole dietro le quinte - come fanno le normali routine casuali - per ragioni estranee alla domanda).
> (ps ho menzionato i numeri casuali, ma non posso sostituirlo con una soluzione che utilizza lo stato mutabile dietro le quinte - come fanno le "normali" routine casuali - per ragioni estranee alla domanda). Si potrebbe usare a) un generatore pseudo-casuale che trasporta un seme intorno, o b) copia lo stato mutabile (in modo che non sia mutabile). Ho adottato questo approccio per l'implementazione [puro mersenne twister] [1]. [1]: http://hackage.haskell.org/package/mersenne-random-pure64-0.2.0.3 –
Sono venuto qui per fare la stessa domanda – jes5199
@DonStewart - non capisco come sarebbe cambia quello che sto chiedendo. in effetti, quello che sto facendo è copiare lo stato - questo è lo stato '' '' in alto 'e la fonte dei miei problemi. –