gpt4 book ai didi

Clojure 类型基础知识

转载 作者:行者123 更新时间:2023-12-02 07:19:48 25 4
gpt4 key购买 nike

我已经开始使用看似相当令人印象深刻的 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/multiply的返回类型是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) apply 中多态函数的参数错误在:(应用合并+向量)

问题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) 多态函数 merge-with 无法应用于参数:多态变量: k v

感谢您提供的任何帮助。

最佳答案

你的答案已经有 3 年历史了,所以这可能没有太大帮助,但我大约在同一时间在一个大型生产代码库中使用 Typed Clojure,并且有一些经验。另外,weavejester 在您的 Reddit thread 中提供的答案关于该主题的内容几乎都是准确的,因此我将在这里重新总结它们,以免 future 的访问者必须点击另一个链接而带来不便。

总的来说,您的方法在高层次上是正确的,但您遇到了 core.typed 根本不知道(也许仍然不知道)如何明智行事的领域。

事情是这样的:

问题1

这可能应该被视为代表 core.typed 的错误,因为有一个函数签名支持 Double 作为返回类型。您可以通过使用 clojure.lang.Numberclojure.core.typed/Num 来规避此问题,两者都包含 Long

问题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)})

关于Clojure 类型基础知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28274061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com