Clojure 此类型不支持第n个:关键字

Clojure 此类型不支持第n个:关键字,clojure,Clojure,我是Clojure的新手,作为一个学习练习,我正在尝试编写一个函数来验证地图中键的存在 当我尝试运行下面的代码时,我得到一个错误 java.lang.UnsupportedOperationException:n此类型不支持:关键字 据我所知,我只是部分地应用了validate函数并在映射上断言每个validations函数——但它似乎不起作用——所以我一定是误解了什么?每个?都将集合作为第二个参数,您的validate函数也是如此。由于将向量传递给every?,因此将对向量的内容调用valid

我是Clojure的新手,作为一个学习练习,我正在尝试编写一个函数来验证地图中键的存在

当我尝试运行下面的代码时,我得到一个错误

java.lang.UnsupportedOperationException:n此类型不支持:关键字


据我所知,我只是部分地应用了validate函数并在映射上断言每个validations函数——但它似乎不起作用——所以我一定是误解了什么?

每个?
都将集合作为第二个参数,您的
validate
函数也是如此。由于将向量传递给
every?
,因此将对向量的内容调用
validate
(即
:name
(补零?
)。在
validate
的定义中,您还缺少一个结束参数。请尝试以下操作:

(def record {:name "Foobar"})

(def validations [:name (complement nil?)])

(defn validate
  [candidate [key val]]
  (val (get candidate key)))

(def actual (every? (partial validate record) [validations]))
(= true actual)

顺便说一句,您可以使用
some?
而不是
(补码为零?

每?
使用一个集合作为第二个参数,您的
验证
函数也是如此。由于将向量传递给
every?
,因此将对向量的内容调用
validate
(即
:name
(补零?
)。在
validate
的定义中,您还缺少一个结束参数。请尝试以下操作:

(def record {:name "Foobar"})

(def validations [:name (complement nil?)])

(defn validate
  [candidate [key val]]
  (val (get candidate key)))

(def actual (every? (partial validate record) [validations]))
(= true actual)

顺便说一句,您可以使用
some?
而不是
(补码为零?

错误来自于您在验证中使用的分解:
[key val]
。在引擎盖下,分解使用函数
nth
,这就是失败的地方

您的问题是,您正在向
每?
传递
[关键字验证功能]
的列表。而
every?
迭代该列表的每个元素,并用它调用部分应用的验证函数。这意味着首先使用关键字
:name
调用validate,并引发异常,因为无法从关键字
:name
中提取
[key val]
对,从而导致异常

要解决此问题,您需要将验证列表设置为一个列表列表,如下所示:

(def record {:name "Foobar"}) 
(def validations [[:name (complement nil?)]])

(defn validate
  [candidate [key val]]
  (val (get candidate key)))

(def actual (every? (partial validate record) validations))
(= true actual)
;; => true
通过这种方式,
each?
现在正在迭代每对
[关键字验证函数]
,一次迭代一个,然后调用validate。因为这是一对,所以可以将其分解为一个
[key val]
,一切都正常


正如您所知,在较新的Clojure版本(1.6及以上版本)中,现在有一个名为
some?
的函数,它相当于
(补码为零?

错误来自您在validate中使用的解构:
[key val]
。在引擎盖下,分解使用函数
nth
,这就是失败的地方

您的问题是,您正在向
每?
传递
[关键字验证功能]
的列表。而
every?
迭代该列表的每个元素,并用它调用部分应用的验证函数。这意味着首先使用关键字
:name
调用validate,并引发异常,因为无法从关键字
:name
中提取
[key val]
对,从而导致异常

要解决此问题,您需要将验证列表设置为一个列表列表,如下所示:

(def record {:name "Foobar"}) 
(def validations [[:name (complement nil?)]])

(defn validate
  [candidate [key val]]
  (val (get candidate key)))

(def actual (every? (partial validate record) validations))
(= true actual)
;; => true
通过这种方式,
each?
现在正在迭代每对
[关键字验证函数]
,一次迭代一个,然后调用validate。因为这是一对,所以可以将其分解为一个
[key val]
,一切都正常


正如您所知,在较新的Clojure版本(1.6及以上)中,现在有一个名为
some?
的函数,它相当于
(补码为零?

验证需要是一个映射
{:name(补码为零?}
,或者是一个成对的序列
[:name(补码为零?)]
。(另外,
(补码为零?
某些?
相同)问题是
每个?
都将函数应用于
验证的每个成员,按照您的方式,
验证的第一个成员是
:name
。当clojure试图将关键字
:name
解构为
validate
[key val]
形式参数时,会发生错误。验证需要是一个映射
{:name(complement nil?}
,或者是一个成对的序列
[[:name(complement nil?)]
。(另外,
(补码为零?
某些?
相同)问题是
每个?
都将函数应用于
验证的每个成员,按照您的方式,
验证的第一个成员是
:name
。clojure试图将关键字
:name
解构为
[key val]
验证的形式参数时,会发生错误。