我刚刚写了这段代码:
(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我提到了随机数,但由于与问题无关的原因,我不能用在幕后使用可变状态的解决方案来替换它 - 正如“正常”随机例程所做的那样)。