首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure pmap返回的结果与map不同

Clojure pmap返回的结果与map不同
EN

Stack Overflow用户
提问于 2015-04-20 10:55:29
回答 2查看 123关注 0票数 3

我正在学习clojure,并实现我的标准测试项目Tic Tac Toe 10。我以前在许多语言中编写过相同的AI,在其他语言中扩展到超过6步时也遇到了问题。

我得到了AI算法的基本工作,但我正在努力提高pmap的速度。因为一切都是不可变的,所以我应该能够直接在pmap中替换map并获得相同的结果,但我没有看到这一点。

代码语言:javascript
复制
(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)

但该spot中的pmap返回的结果不一致。不知道从哪里开始找。如果需要的话,我可以发布更多的代码。

EN

回答 2

Stack Overflow用户

发布于 2015-04-21 06:54:27

用let everywhere替换def解决了这个问题。如果我不使用let,我的函数会有很多不一致的副作用。

代码语言:javascript
复制
(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
EN

Stack Overflow用户

发布于 2015-04-20 21:12:59

在考虑进行性能调优之前,请先阅读一两本关于clojure的书。在一种语言中内置了不变性并不意味着你可以用pmap替换map。

还有两件事需要考虑,一是代码没有副作用,二是操作必须是可交换的。如果它们不是,则必须在合并算法中考虑这一点。

正如其他人所说,不要在内部函数中创建def绑定,而要使用let。另外,最后一个表达式无论如何都会从函数中返回,所以在返回它之前不需要绑定final

我很抱歉没有给你一个直接的解决方案,我只是认为你需要理解更换地图并不像看起来那么容易。

如果你仍然想解决你的问题,我想我们需要在这里看到更多的代码。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29738620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档