Clojure Spec on vararg函数

保罗

我正在尝试为合并函数编写规范,该函数采用一个函数并将其映射为输入并使用函数来解决冲突。但是我为该函数编写的规范失败。我试图弄清楚如何编写此类功能的规范。

下面是代码片段。

(require '[clojure.spec.test :as stest])
(require '[clojure.spec :as spec])

(defn deep-merge-with [func & maps] 
  (let [par-func (partial deep-merge-with func)] 
    (if (every? map? maps) 
        (apply merge-with par-func maps) 
        (apply func maps))))

(spec/fdef deep-merge-with
           :args (spec/cat :func (spec/fspec :args (spec/cat :maps (spec/* map?))
                                             :ret map?)
                           :maps (spec/cat :maps (spec/* map?)))
           :ret map?)

(stest/instrument `deep-merge-with)

(deep-merge-with (fn [f s] s) {:a 1} {:a 2})

我得到的规范错误是:

clojure.lang.ExceptionInfo: Call to #'boot.user/deep-merge-with did not conform to spec:
    In: [0] val: () fails at: [:args :func] predicate: (apply fn),  Wrong number of args (0) passed to: user/eval22001/fn--22002
                                :clojure.spec/args  (#function[boot.user/eval22001/fn--22002] {:a 1} {:a 2})
山姆·埃斯特普(Sam Estep)

在您的[:args :func]规格中:

(spec/fspec :args (spec/cat :maps (spec/* map?)) :ret map?)

您是说该函数必须接受任意数量的映射作为参数并返回一个映射。但是您传递给的函数deep-merge-with不符合该规范:

(fn [f s] s)

此函数仅使用两个参数,而不是任意数量的映射。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章