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