评论者:nberger
bq. 我们讨论了将 nil 作为在 collect 中不进行标签操作的标志,但我并不特别赞同这个想法。
也许我们可以使用一个命名空间关键字来表示应该忽略标签,例如 {{clojure.test.check.stats/ignore}}。这样,我们可以创建一个函数,根据pred是否匹配返回 {{stats/ignore}},从而轻松地将 {{classify}} 实现为 collect 的一个术语。
`
(defn collect
[prop label-fn]
(gen/fmap
(fn [{:keys [args] :as result-map}]
(let [label (apply label-fn args)]
(if (= ::ignore label)
result-map
(update result-map :labels conj label))))
prop))
(defn classify
[prop pred label]
(collect prop (fn [& args]
(if (apply pred args)
label
::ignore))))
`
另一种选择可能是向 {{collect}} 添加额外的参数,以接收关于是否将 nil 作为标签或忽略它的标志。我更喜欢 {{:stats/ignore}}。