簡體   English   中英

如何為帶有序列參數的函數編寫Clojure Spec?

[英]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/cats/*組成了一個具有零個或多個元素的單個序列的描述。

(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM