Właśnie napisał ten kod:Jak lepiej iteracyjnego państwa w Clojure (monady?)
(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))))
funkcja parameters
generuje leniwy sekwencji wartości generowanych z state
, które są wykorzystywane do parametryzacji powtórzoną transformację czegoś ("mozaika" w tym przypadku).
Wydaje mi się, że parameters
pokazuje dość powszechny wzór, który pojawia się, gdy masz jakieś state
, które muszą być przenoszone (w tym przypadku do generowania losowych wartości). czy jest na to nazwa?
Czy istnieje lepszy sposób na napisanie pierwszej funkcji? podobne problemy można często rozwiązać za pomocą reduce
, które "przenoszą" stan, ale tutaj nie mam nic do zredukowania. podobnie, reductions
wydaje się nie pasować. czy to jest dobre dla monady? (z teoretycznego pov nie rozumiem, jak definiujesz sposób łączenia wielu instancji w jedno, ale być może to nie zmienia praktycznego zastosowania - wydaje się, że takie monady rozwiązują gdzie indziej, gdzie niektóre państwa muszą być noszonym dookoła).
(ps wymieniłem losowe liczby, ale nie mogę zastąpić tego rozwiązaniem, które wykorzystuje zmienny stan za kulisami - jak robią to "normalne" losowe rutyny - z przyczyn niezwiązanych z pytaniem).
> (ps wymieniłem losowe liczby, ale nie mogę zastąpić tego rozwiązaniem, które wykorzystuje zmienny stan za kulisami - jak robią "normalne" losowe rutyny - z powodów niezwiązanych z pytaniem). Możesz użyć a) pseudolosowego generatora przenoszącego ziarno dookoła lub b) skopiuj stan zmienny (aby nie można było go zmienić). Zastosowałem to podejście do implementacji [czystego mersenne twister] [1]. [1]: http://hackage.haskell.org/package/mersenne-random-pure64-0.2.0.3 –
Przyszedłem tutaj, aby zadać to samo pytanie – jes5199
@DonStewart - nie rozumiem, jak to by zmień to, o co pytam. w rzeczywistości to, co robię, to kopiowanie stanu - oto, czym jest "stan" powyżej i źródło moich problemów. –