我已经开始使用看上去相当令人印象深刻的clojure.typed库,但在遇到问题后不久,甚至在尝试将它应用于简单函数时也是如此。有人有图书馆的经验吗?
问题1
(typed/ann square [Double -> Double])
(defn square "Square of"
[num]
(* num num))类型错误(clojure_study/ideas/swarm/vector_algebra.clj:15:3)返回类型的静态方法clojure.lang.numbers/乘是java.lang.Long,预期的java.lang.Double。
问题2
(typed/defalias CartesianVector '{:x Double :y Double})
(typed/ann v+ [CartesianVector * -> CartesianVector])
(defn v+ "Sum vector of vectors"
[& vectors]
(apply merge-with + vectors))在以下(应用合并+向量)中对多态函数输入错误(clojure_study/ideas/swarm/vector_algebra.clj:28:3)坏参数
问题3
(typed/ann v- [CartesianVector CartesianVector -> CartesianVector])
(defn v- "Diff vector of vectors"
[v1 v2]
(merge-with - v1 v2))类型错误(clojure_study/ideas/swarm/vector_algebra.clj:33:3)多态函数合并不能应用于参数:多态变量:k
谢谢你的帮助。
发布于 2018-04-26 11:39:10
您的答案现在已经3年了,所以这可能没有多大帮助,但是我在一个大型的生产代码库中使用了类型化Clojure,并且对它有一定的经验。而且,weavejester在您的Reddit线程中提供的关于这个主题的答案几乎是对的,所以我将在这里重新总结它们,以避免将来的访问者不得不单击另一个链接所带来的不便。
一般来说,您的方法在高级别上是正确的,但是您所遇到的领域core.typed根本不知道(也许仍然不知道)如何聪明行事。
下面是发生的事情:
问题1
这可能应该被认为是代表core.typed的一个bug,因为有一个函数签名支持Double作为返回类型。您可以通过使用clojure.lang.Number或clojure.core.typed/Num来规避这一问题,这两种方法都包含Long和Double。
问题2
这只是语法错误--不是这样指定到core.typed的映射的。您应该使用HMap来代替:
(t/defalias CartesianVector
(t/HMap :mandatory {:x t/Num, :y t/Num} :complete? true))问题3
不幸的是,core.typed无法成功地推断,当应用于两个相同类型的映射时,merge-with (一个核心函数)将返回相同类型的映射。这是类型检查器的一个限制。您可以通过重写函数以显式合并而不是依赖于merge-with来解决这一问题。
(defn v-
[{x1 :x, y1 :y} {x2 :x, y2 :y}]
{:x (- x1 x2), :y (- y1 y2)})https://stackoverflow.com/questions/28274061
复制相似问题