clojure-spec:无法正确获取函数的后置条件

时间:2019-08-03 17:47:46

标签: clojure clojure.spec

我正在尝试使用clojure spec的简单函数,该函数计算方阵中(行,列)位置的“邻居”。例如,对于下面给出的4x4矩阵,像元(1,1)的邻居应为:(0,1),(1,0),(1,2),(2,1)。甚至不在矩阵范围内的像元(4,3)的邻居应该是(3,3)等。

4x4 square matrix and two positions with their neighbours

函数的输入是矩阵的大小和感兴趣位置的(行,列)。输出是邻居(行,列)的集合。如果没有邻居,则此集合可以为空。

此问题可以在“ Clojure的喜悦,第二版,第94页;中找到;但是由于原始代码对我来说太紧凑,所以对代码进行了修改。然后,我尝试对其进行规范并检查{{1 }}和:pre部分。

但是,我无法使用:post部分。运行测试用例时,我得到:

:post

要更改什么?

java.lang.ClassCastException: java.lang.Boolean cannot be cast
to clojure.lang.IFn

1 个答案:

答案 0 :(得分:1)

您只是缺少#前缀以使匿名功能处于:post条件。后置条件必须是一个可以获取主题函数调用输出的函数。

:post [#(s/valid? ::be-row-col-vector %)]

也可以改写为:

:post [(fn [o] (s/valid? ::be-row-col-vector o))]

但是根据您的用例,您可能希望研究function specsinstrument作为:pre:post条件的替代方法。我写了更多examples here.