我正在学习clojure,并实施我的标准测试项目Tic Tac Toe 10。我以前用多种语言编写了相同的AI,并且在将其扩展到其他语言的6个步骤之前也遇到了问题。
我的AI算法基本上工作,但我试图用pmap提高速度。由于一切都是不可变的,我应该能够放入pmap代替地图并得到相同的结果,但我没有看到。
(defn get-spot
[board player win-cond levels]
(def avail (get-available board))
(def final
(apply merge
(map #(array-map % (calc-score board player win-cond levels %)) avail)))
final)
但是那个地方的pmap会返回不一致的结果。不知道从哪里开始寻找。如果需要,我可以发布更多代码。
答案 0 :(得分:1)
替换def让所有地方解决了问题。如果我没有使用let,我的函数有很多不一致的副作用。
(defn get-spot
[board player win-cond levels]
(let [avail (get-available board)
final (apply merge
(pmap #(array-map % (calc-score board player win-cond levels %)) avail))]
final))
我写了一堆clojure代码,并阅读了很多教程。我不知道自己错过了那个非常重要的细节。
答案 1 :(得分:-1)
在考虑进行性能调整之前,请先阅读一两本关于clojure的书。将不可变性内置到语言中并不意味着您只需用pmap替换map。
还需要考虑的另外两件事是您的代码没有副作用以及操作必须是commutativ的事实。 如果不是,则必须在合并算法中考虑这一点。
正如其他人已经说过的那样,不要创建def
绑定内部函数,而是使用let
。此外,最后一个表达式无论如何都会从函数返回,所以在返回之前你不需要绑定final
。
我很抱歉没有直接解决您的问题,我认为您需要了解更换地图并不像看起来那么容易。
如果你仍然希望你的问题得到解决,我想我们需要在这里看到更多代码。