繁体   English   中英

这个clojure.core.typed类型错误是什么意思?

[英]What does this clojure.core.typed type error mean?

我想得到clojure.core.typed类型检查传递,但我得到一个我不明白的类型错误。

我的问题是:

  • 下面的错误是什么意思?
  • 我该如何解决?

这是我的代码(我意识到这是不正确的):

(ns clj.util.map
  (:require [clojure.core.typed :as t]))

(t/ann map-vals
       (All [k v1 v2]
            (Fn [ (Fn [(t/Option v1) -> (t/Option v2)])
                  (t/Option (t/Map k v1)) ->
                  (t/Option (t/Map k v2)) ])))

(defn map-vals
  ;; FIXME: Incorrect code
  "Apply a function to each of the values in a map, returning the updated map."
  [f hm]
  (t/doseq> [k :- Any (keys hm)]
            (assoc hm k (f (get hm k)))))

这是lein typed check clj.util.map的输出:

Initializing core.typed ...
"Elapsed time: 6697.604 msecs"
core.typed initialized.
Start collecting clj.util.map
Finished collecting clj.util.map
Collected 1 namespaces in 6851.111 msecs
Start checking clj.util.map
Checked clj.util.map in 968.041 msecs
Checked 1 namespaces (approx. 21 lines) in 7823.552 msecs
Type Error (clj.util.map:14:23) Polymorphic function clojure.core/keys could not be applied to arguments:
Polymorphic Variables:
    k

Domains:
    (t/Map k Any)

Arguments:
    (t/Option (t/Map k v1))

Ranges:
    (t/Seq k) :object {:path [Keys], :id 0}

in: (clojure.core/keys hm)
in: (clojure.core/seq (clojure.core/keys hm))


Type Checker: Found 1 error
Found errors
Subprocess failed

错误的第一部分告诉您这涉及对clojure.core/keys的调用。 您可以使用(cf keys)查找类型。

(All [k] [(Map k Any) -> (Seq k) :object {:id 0 :path [Keys]}])

该错误基本上总结了这种与提供给函数的实际类型并列的多态类型。

Polymorphic Variables列出了All活页夹中的All变量及其类型边界。 k是唯一的变量,它基本上没有边界,因此显示k

Domains按顺序列出所有参数类型( ->的左侧)。 如果使用Fn指定了多个arities,则将按顺序显示每个参数列表。

Arguments显示实际传递给函数的类型。 14:23的代码可能是这个调用(keys hm) ,因此显示第一个参数的类型: (t/Option (t/Map k v1))

Ranges按顺序列出所有返回类型(在->的右侧)。

有时会有一个Expected类型,它必须与Range匹配,就像所有Arguments必须与Domain匹配一样。

我们可以通过比较DomainsArguments来诊断此错误。 Arguments列表必须符合一个Domains列表,并且自上而下尝试匹配。 如果没有Domains符合Arguments ,我们会得到类似的错误; 通常很难确定约束算法失败的确切位置,因此向用户提供了大量信息。

在这种情况下,我们尝试在域(t/Map k Any)下拟合参数(t/Option (t/Map k v1)) (t/Map k Any) ,该参数失败。 这是因为参数(t/Option (t/Map k v1))(U nil (t/Map k v1)) ,并且nil不适合域(t/Map k Any)

有几种方法可以解决这个问题。 你基本上需要确保keys没有传递nil 这是一个选项:

(keys (or hm {}))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM