2

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

[[: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 的向量,甚至更好(如果可能的话),一种支持随机访问的结构。似乎在模式中使用 [ ] 仅测试序列,因此列表列表也将通过模式。

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

4

1 回答 1

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)))]
于 2016-04-15T14:22:23.427 回答