比方说,我有一个函数,它接受一个函数并返回一个函数,该函数应用它传递给函数的任何参数,并将结果放入一个向量中(这是一个不好的例子,但希望能够说明我的观点)。如何在Clojure中指定高阶函数参数?
(defn box [f]
(fn [& args]
[(apply f args)]))
我认为存储箱功能的规格看起来像这样
(spec/fdef box
:args (spec/cat :function (spec/fspec :args (spec/* any?)
:ret any?))
:ret (spec/fspec :args (spec/* any?)
:ret (spec/coll-of any? :kind vector? :count 1)))
如果我当时仪器箱功能
(spec-test/instrument)
和呼叫与clojure.core盒/ +我得到例外
(box +)
ExceptionInfo Call to #'user/box did not conform to spec:
In: [0] val: ([]) fails at: [:args :function] predicate: (apply fn), Cannot cast clojure.lang.PersistentVector to java.lang.Number
:clojure.spec.alpha/args (#function[clojure.core/+])
:clojure.spec.alpha/failure :instrument
:clojure.spec.test.alpha/caller {:file "form-init4108179545917399145.clj", :line 1, :var-scope user/eval28136}
clojure.core/ex-info (core.clj:4725)
如果我正确地理解错误,那么它将采取任何措施?谓词并为测试生成一个PersistentVector,该clojure.core/+显然不能使用。这意味着我可以得到它通过改变框的参数功能规格工作是
(spec/fspec :args (spec/* number?)
:ret number?)
,但如果我想用框都clojure.core/+和clojure.string /小写呢?
N.B.要获得规范在REPL工作,我需要
:dependencies [[org.clojure/clojure "1.9.0-alpha16"]]
:profiles {:dev {:dependencies [[org.clojure/test.check "0.9.0"]]}}
:monkeypatch-clojure-test false
在project.clj及以下进口
(require '[clojure.spec.test.alpha :as spec-test])
(require '[clojure.spec.alpha :as spec])