`any?` 生成器有时会返回 Double/NaN 值。由于 NaN 与等式(通过 `=`)不相容,因此您在函数中:ret spec' 着手按谓词处理集合时会出现相当大的问题。这是因为在 ret spec 中的最明显的事情(即谓词对任何值都没有返回 true,因此输出集合应该等于输入集合,因为没有什么被转换/处理),不能简单表示。
在我的规范规格说明中,我想出的一个权宜之计是用 (s/and any? (complement double-NaN?))
来规范集合的元素,而不是仅仅使用 any?
,并且它有效。然而,尽管我可以在测试中没有 NaN,但我必须承认这仍然感觉有点无关紧要。
想法
1) `any?` 的生成器可以从硬编码永不返回 Double/NaN。这似乎相当具有侵略性。
2) `any?` 的生成器可以被重构为以某种方式允许/禁止 Double/NaN。然后,也许可以通过动态-var 和/或宏(例如 without-NaNs
)来揭示这一点(这只是一个思考)。
3) `any?` 的生成器可以保持不变,但可以添加一个新的比较运算符,例如(例如 `clojure.spec/===`),它以某种方式忽略 NaN (例如,一个简单的实现可能遍历数据结构,并用关键字替换所有的 NaN,然后执行常规比较)。