gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:00:01 24 4
gpt4 key购买 nike

我想要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 key)查找类型。


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

该错误基本上是将此多态类型与提供给函数的实际类型并列进行总结。

多态变量列出了All绑定(bind)器中的所有变量及其类型边界。 k 是唯一的变量,基本上没有界限,因此显示 k

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

参数显示实际传递给函数的类型。 14:23处的代码大概就是这个调用(keys hm),所以显示第一个参数的类型:(t/Option (t/Map k v1))

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

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

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

在本例中,我们尝试将参数 (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。这是一种选择:


(按键(或 hm {}))

关于types - 这个 clojure.core.typed 类型错误是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21681100/

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