我正在使用 Clojure 规范来规范一个简单的数据结构:
{:max 10
:data [[3 8 1]
[9 0 1]]}
该值是在从零到值(含:data
)的区间内的等大小整数向量的向量。:max
我用规范表达了这一点,如下所示:
(s/def ::max pos-int?)
(s/def ::row (s/coll-of nat-int? :kind vector?, :min-count 1))
(s/def ::data (s/and (s/coll-of ::row :kind vector?, :min-count 1)
#(apply = (map count %))))
(s/def ::image (s/and (s/keys :req-un [::max ::data])
(fn [{:keys [max data]}]
(every? #(<= 0 % max) (flatten data)))))
自动生成器适用于前三个规格,但不适用于::image
. (s/exercise ::image)
尝试 100 次后总是失败。
我试图创建一个自定义生成器,::image
但没有管理。我看不出如何表达跨越嵌套结构层的约束(键:max
约束其他地方的向量中的值)。
是否可以创建一个生成 s 的 Clojure spec/test.check 生成器::image
?