Clojure 类型提示,无法解析类名 clojure.core$double

Posted

技术标签:

【中文标题】Clojure 类型提示,无法解析类名 clojure.core$double【英文标题】:Clojure type hinting, Cannot resolve classname clojure.core$double 【发布时间】:2015-03-26 13:15:22 【问题描述】:

我有以下代码,但是在尝试对最终的规范化函数进行类型提示时,编译器会报错:无法解析类名:clojure.core$double。

我看不出在平方和或 vec-length 中没有完成的归一化函数有什么不同。

谢谢。

(defn ^double sum-of-squares
  "Given a vector v, compute the sum of the squares of elements."
  [^doubles v]
  (r/fold + (r/map #(* % %) v)))

(defn ^double vec-length
  "Compute the length of vector v."
  [^doubles v]
  (Math/sqrt (sum-of-squares v)))

(defn ^doubles normalize
  "Compute the unit vector (normalize) v."
  [^doubles v]
  (let [l (vec-length v)]
    (into [] (r/map #(/ % l) v))))

【问题讨论】:

【参考方案1】:

返回值的类型提示必须放在参数向量之前而不是名称之前。

http://clojure.org/java_interop#Java%20Interop-Type%20Hints

你的第一个定义应该是这样的

(defn sum-of-squares
  "Given a vector v, compute the sum of the squares of elements."
  (^double [^doubles v]
    (r/fold + (r/map #(* % %) v))))

【讨论】:

小注:函数定义中不需要额外的括号:(defn sum-of-squares (^double [^doubles v] (r/fold + (r/map #(* % %) v))))可以只是(defn sum-of-squares ^double [^doubles v] (r/fold + (r/map #(* % %) v)))。此外,需要修复之前的 2 个功能才能使其正常工作。

以上是关于Clojure 类型提示,无法解析类名 clojure.core$double的主要内容,如果未能解决你的问题,请参考以下文章

类型提示存储为clojure中的元数据?

Clojure : 类型提示塔

卡在 clojure 中的泛型类类型提示

Clojure 中函数的类型提示

在 Clojure 中类型提示一个 nil 文字

为啥 Clojure 编译器不会为不正确的类型提示抛出错误?