[英]How do I write a Clojure Spec for a function that takes a sequence argument?
我正在編寫一個函數,該函數采用一系列Triangles(實際上表示為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
。
有什么問題?
注意,:: Triangle被定義:
(s/def ::Triangle (s/keys :req-un [::A ::B ::C ::a ::b ::c ::ax ::ay ::bx ::by ::cx ::cy]))
:args
規范不起作用的原因是, 正則表達式規范構成了嵌套時描述單個序列的功能 。
您可以通過將內部正則表達式s/*
包裝在s/spec
來逃避此行為:
(s/cat :trs (s/spec (s/* ::maths/Triangle)))
或者使用其他非正則表達式規范來描述sequence參數:
(s/cat :trs (s/coll-of ::maths/Triangle))
如果函數是可變參數,則示例規范將起作用,因為s/cat
和s/*
組成了一個具有零個或多個元素的單個序列的描述。
(defn adder [& nums] (apply + nums))
(s/fdef adder :args (s/cat :nums (s/* int?)))
(st/instrument `adder)
(adder 1 2 3)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.