Как я могу создать спецификацию, которая принимает только последовательные (то есть сохраняющие порядок) коллекции?
Например
cljs.user=> (s/def ::path (s/+ number?))
:cljs.user/path
cljs.user=> (s/explain ::path [])
val: () fails spec: :cljs.user/path predicate: number?, Insufficient input
:cljs.spec.alpha/spec :cljs.user/path
:cljs.spec.alpha/value []
cljs.user=> (s/explain ::path [1 2 3])
Success!
Это как и ожидалось, но в то же время обратите внимание на порядок
cljs.user=> #{1 2 3}
#{1 3 2}
cljs.user=> (s/explain ::path #{1 2 3})
Success!
И это, кажется, не имеет никакого смысла. Так что второстепенный вопрос:
Почему связанные с последовательностью выражения (cat, *, +,?) в спецификации принимают коллекции, нарушающие последовательность?
UPD Я перепутал последовательное/упорядоченное различие в исходном вопросе. Почистил терминологию.
+
означает 1..n (как в регулярном выражении). Это не предполагает никакого порядка. Вам нужно будет добавить предикат для этого самостоятельно. - person cfrick   schedule 13.12.2018