在我的程序中,我使用的是一种矩阵(作为向量的向量),如下所示:
[[: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的向量,或者甚至更好(如果可能),支持随机访问的结构。似乎在模式中使用[]只测试序列,因此列表列表也会传递模式。
如何用架构表达此约束?
答案 0 :(得分:3)
您可以使用schema/both
和schema/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)))]