专门检查矩阵中的向量 Clojure 的架构

Check specifically for vector in a matrix Clojure's Schema

在我的程序中,我使用了一种矩阵(作为向量的向量),如下所示:

[[:lt :lt :gt :eq]
 [:eq :lt :gt :eq]
 [:eq :eq :gt :gt]
 [:un :eq :lt :lt]]

我有一个架构,声明为:

(def OrderMatrix [[(s/enum :lt :eq :gt :un)]]

我想做的是进一步限制模式,以确保我的矩阵是 clojure.lang.PersistentVector 的向量,或者甚至更好(如果可能),支持随机访问的结构。似乎在架构中使用 [ ] 仅测试顺序,因此列表列表也将通过架构。

如何用模式表达这个约束?

您可以使用 schema/bothschema/pred 的组合。这是一个例子:

(defn Vector [inner-schema]
  (schema/both (schema/pred vector? "vector")
               [inner-schema]))

(defn RandomAccess [inner-schema]
  (schema/both
   (schema/pred
    (partial instance? java.util.RandomAccess)
    "random access")
   [inner-schema]))

(def OrderMatrix (Vector (Vector (schema/enum :lt :eq :gt :un))))
;; or (def OrderMatrix (RandomAccess (RandomAccess (schema/enum :lt :eq :gt :un))))

然后:

user> (schema/check OrderMatrix ['(:lt)])
[(not ("vector" (:lt)))]