适用于 `any?
` 的生成器偶尔会返回 Double/NaN 值。由于 NaN 与等价(通过 `=
`)不合,对根据谓词变换/处理集合的函数进行 :ret 规范,变得相当有挑战性。原因在于在 :ret 下最明显的事情要检查的案例(谓词未对任何值返回 true,因此输出集合应等于输入集合,因为没有任何事物被变换/处理),无法简单地表示。
我在自己的规范中想到的一个解决方案是用 `(s/and any? (complement double-NaN?))
` 来规范集合的元素,而不是仅仅使用 `any?
`,它可行。尽管我可以没有 NaN 进行测试,但我必须承认这感觉仍然有点像是在做手脚。
想法
1) `any?
` 的生成器可以硬编码为永远不会返回 Double/NaN。听起来相当具有侵略性。
2) `any?
` 的生成器可以被重新设计为在允许/禁止 Double/NaN 方面可配置。然后可能会使用动态变量和/或宏(例如 `without-NaNs
`)公开这一点(这里只是进行头脑风暴)。
3) `any?
` 的生成器可以保持现状,但可以添加一个新的等价操作符(例如 `clojure.spec/===
`),这个操作符在某种意义上忽略了 NaN(例如,一种简单的实现可能是遍历数据结构,用关键字替换所有 NaN,然后执行常规比较)。