【问题标题】:Clojure.typed basicsClojure.typed 基础
【发布时间】:2018-04-26 19:39:10
【问题描述】:

我已经开始使用看似令人印象深刻的 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 无法应用于参数: 多态变量: ķ v

感谢您提供的任何帮助。

【问题讨论】:

  • from /r/clojure 得到答案了吗?如果是这样,请考虑在此处为未来的访问者添加答案或关闭问题。
  • 对于问题 1,我得到了答案:使用 clojure.core.typed/Num。对于问题 2 和 3,不幸的是不是。详情见r/clojure

标签: clojure clojure-core.typed


【解决方案1】:

您的答案现在已经 3 年了,所以这可能没有太大帮助,但我大约在同一时间在大型生产代码库中使用 Typed Clojure 并且有一些经验。此外,weavejester 在您的Reddit thread 中提供的有关该主题的答案非常准确,因此我将在此处重新总结它们,以免将来的访问者不得不单击另一个链接带来的不便。

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

这是怎么回事:

问题 1

这可能代表core.typed 被认为是一个错误,因为有一个函数签名支持Double 作为返回类型。您可以使用clojure.lang.Numberclojure.core.typed/Num 来规避此问题,它们都包含LongDouble

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

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 2022-09-29
    • 1970-01-01
    • 2017-06-20
    • 2011-06-16
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多