Clojure 1.4 似乎不支持没有类型提示的 amap

标签 clojure

我正在处理 The Joy of Clojure (据我所知,这是为 Clojure 1.2 编写的)并且我正在尝试了解有关 amap 和相关功能的一些信息。

以下代码在没有类型提示的情况下无法在 Clojure 1.4 中运行:

(defn asum-sq [xs]
  (let [dbl (amap xs i ret
                 (* (aget xs i)
                    (aget xs i)))]
    (areduce dbl i ret 0.0
      (+ ret (aget dbl i)))))

回复:

user=> (asum-sq (float-array [1 2 3 4]))
IllegalArgumentException No matching method found: aset clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:80)

添加了类型提示的版本有效:

(defn ^Double asum-sq [^floats xs]
  (let [^floats dbl (amap xs i ret
                       (* (aget xs i)
                          (aget xs i)))]
    (areduce dbl i ret 0.0
      (+ ret (aget dbl i)))))

回复:

user=> (asum-sq (float-array [1 2 3 4]))
30.0

我很难找到有关此问题的信息。这个突破性的变化到底是什么时候引入的?还是我理解有误?

最佳答案

突破性的变化是 RT/agetRT/aset 的过于通用的重载被删除了。

a[gs]et 用于当您需要原始速度(否则您将 seqvec 数组)并且缺少适当的暗示使他们默默地选择了一条缓慢的道路。

关于Clojure 1.4 似乎不支持没有类型提示的 amap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12429109/

相关文章:

vector - Clojure - 为一个人定义一个数据结构

java - Clojure Speclj with-redefs 和来自不同线程的 stub

clojure - 如何使 leiningen 2 尊重 maven settings.xml 文件中的本地存储库路径?

if-statement - Clojure:if 中的多个任务

clojure - 如何使用 clojure 查找列表中多次出现的数字

java - Clojure、Spring、Tomcat集成时的类加载过程

java - 在eclipse上安装逆时针插件失败

clojure - Hiccup:如何在试剂中显示引号?

functional-programming - 关于闭包中词法绑定(bind)的更多解释?

clojure - clojure 中是否有类似 ":until"的命令?