如何使用规范定义一系列大小相等的集合? (可能吗?)

How to define a sequence of equal sized collections with spec? (is it possible?)

我希望表示一系列字符串集合。内部集合应具有相同的长度。

我最初的尝试是这样的

(s/def ::stuff (s/every (s/coll-of string?) :min-count 1))

但是当我练习这个时,我得到了不同长度的内部集合。

是否有声明性的方式来指定长度都应该相同?或者这只能在规范的自定义生成器函数中指定吗?

我会将规范表述为

(s/def ::stuff 
  (s/and 
    (s/every (s/coll-of string?)) 
    #(or (empty? %) 
         (apply = (map count %)))))

这很可能是 gen,但您将得到的大多数东西要么是一个空集合,要么是一个元素的集合,这两者都简单地通过了长度约束。为此,您需要一个自定义生成器。