首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure.typed基础

Clojure.typed基础
EN

Stack Overflow用户
提问于 2015-02-02 08:59:21
回答 1查看 476关注 0票数 11

我已经开始使用看上去相当令人印象深刻的clojure.typed库,但在遇到问题后不久,甚至在尝试将它应用于简单函数时也是如此。有人有图书馆的经验吗?

问题1

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

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

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

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2018-04-26 11:39:10

您的答案现在已经3年了,所以这可能没有多大帮助,但是我在一个大型的生产代码库中使用了类型化Clojure,并且对它有一定的经验。而且,weavejester在您的Reddit线程中提供的关于这个主题的答案几乎是对的,所以我将在这里重新总结它们,以避免将来的访问者不得不单击另一个链接所带来的不便。

一般来说,您的方法在高级别上是正确的,但是您所遇到的领域core.typed根本不知道(也许仍然不知道)如何聪明行事。

下面是发生的事情:

问题1

这可能应该被认为是代表core.typed的一个bug,因为有一个函数签名支持Double作为返回类型。您可以通过使用clojure.lang.Numberclojure.core.typed/Num来规避这一问题,这两种方法都包含LongDouble

问题2

这只是语法错误--不是这样指定到core.typed的映射的。您应该使用HMap来代替:

代码语言:javascript
复制
(t/defalias CartesianVector
  (t/HMap :mandatory {:x t/Num, :y t/Num} :complete? true))

问题3

不幸的是,core.typed无法成功地推断,当应用于两个相同类型的映射时,merge-with (一个核心函数)将返回相同类型的映射。这是类型检查器的一个限制。您可以通过重写函数以显式合并而不是依赖于merge-with来解决这一问题。

代码语言:javascript
复制
(defn v-
  [{x1 :x, y1 :y} {x2 :x, y2 :y}]
  {:x (- x1 x2), :y (- y1 y2)})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28274061

复制
相关文章

相似问题

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