在矩阵Clojure的Schema中专门检查向量

时间:2016-04-15 13:45:12

标签: clojure plumatic-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的向量,或者甚至更好(如果可能),支持随机访问的结构。似乎在模式中使用[]只测试序列,因此列表列表也会传递模式。

如何用架构表达此约束?

1 个答案:

答案 0 :(得分:3)

您可以使用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)))]