any?
生成器偶尔会返回一个或多个 Double/NaN 值。由于 NaN 值与等价性(通过 =
操作符)不兼容,对一个按谓词进行收集转换/处理的函数进行 :ret 规范化会变得相当棘手。这是因为 :ret 下最明显要检查的情况(即谓词没有返回任何值为 true,因此输出集合应与输入集合相等,因为没有进行转换/处理),不能简单地表示。
在我的规范中,我已经想出了一个 workaround,即用 (s/and any? (complement double-NaN?))
而不是只用 any?
规范化集合的元素,并且它确实有效。然而,尽管我可以在测试中摆脱 NaN 值,但我必须承认这仍然感觉有点 hacky。
想法
1) 可能为 any?
生成器硬编码为永不返回 Double/NaN。这似乎过于侵入性。
2) 可能为 any?
生成器重构以在某些方面进行配置,允许/禁止 Double/NaN。然后,可能有动态变量和/或宏(例如 without-NaNs
)可以公开这一配置(仅仅是头脑风暴)。
3) 可能让 any?
生成器保持原样,但添加一个新的等价运算符(例如 clojure.spec/===
),它某种方式忽略 NaN(例如,一个简单的实现可能遍历数据结构,将所有 NaN 替换为关键词,然后执行标准的比较)。