我正在写一个函数,它接受一系列三角形(实际上表示为 maps
maps
我的规格是:
(s/fdef triangle-list-to-pattern :args (s/cat :trs (s/* ::maths/Triangle)) )
函数接受一个参数trs,它是一个三角形序列。
fails spec: :patterning.maths/Triangle at: [:args :trs] predicate: map?
如果我用spec显式测试传递给函数的参数,它就会通过。它实际上只是一系列符合三角形标准的事情。
这个功能似乎正在发挥作用。这个论点似乎是正确的,单独测试时通过了规范。所以我想我得到了 fdef 不知怎的错了。
fdef
有什么问题吗?
注:三角形定义如下:
(s/def ::Triangle (s/keys :req-un [::A ::B ::C ::a ::b ::c ::ax ::ay ::bx ::by ::cx ::cy]))
你的原因 :args 规范不起作用,是吗 regex specs
:args
您可以通过包装内部regex规范来避免这种行为 s/* 在里面 s/spec :
s/*
s/spec
(s/cat :trs (s/spec (s/* ::maths/Triangle)))
(s/cat :trs (s/coll-of ::maths/Triangle))
您的示例规范 s/cat 是指用零个或多个元素来描述单个序列。
s/cat
(defn adder [& nums] (apply + nums)) (s/fdef adder :args (s/cat :nums (s/* int?))) (st/instrument `adder) (adder 1 2 3)