2024 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解有关这里的更多信息。

0
math.combinatorics
似乎使用 Clojure 集合作为组合函数的项参数是合理的。然而,在="{{(combinations some-set 1)}}"的情况下,由于 Clojure 的distinct函数(在"{{(= t 1)}}"时调用)不支持集合,因此会抛出异常。可以通过在调用组合函数之前将集合转换为 seq 来解决这个问题。

对于所有其他函数,通过在"{{all-different?}}"中添加"{{set?}}"检查来扩展,可以使函数略微更高效(通过避免线性"{{distinct?}}"扫描)。

8 答案

0

评论者:glchapman

我稍微查看了:看起来"{{nth-permutation-distinct}}"会调用"{{nth}}"在其"{{l}}"参数上。集合不支持"{{nth}}",因此更好的集合支持将需要对该函数进行更改。

0

评论者:markengelberg

参见此处讨论:https://groups.google.com/forum/#!topic/clojure/XUEqdCSI6c4

我认为集合作为有效输入不一定有道理。这些算法返回的结果高度依赖于序列中元素的顺序。由于集合是无序的,因此这种更改将使这些不是纯函数,例如,对于相同的(相等的)输入,它们可以返回完全不同的输出。这是因为比较为相等的两个集合在应用序列应用时可能返回不同顺序的元素。这可能破坏人们在函数中与集合一起使用这些函数等时的测试用例。

我认为用户最好是被迫直接应用seq,而不是让其隐式发生,这样他/她可以思考后果,并在需要时进行某种sort或等效处理,以确保输出的一致性。

0

评论由:nathan

无论是修复还是不修复,至少需要编辑一下文档字符串。

就目前而言,在出现仅包含一个元素的异常情况之前,combinations将会正常工作。像这样的隐藏地雷需要某种类型的修复。
强制对排序问题采取行动将包括抛出异常、弹出警告或让函数在集合上始终出错。

0

评论者:markengelberg

我同意当前的行为是不友好的,可能的解决方案有

1) 对所有输入隐式调用seq(缺点:函数不再纯净)
2) 在集合上抛出错误(缺点:添加了运行时检查)
3) 在文档字符串中添加关于输入必须是序列的信息(缺点:需要阅读文档字符串才能了解约束,每个人都明白“序列”的含义吗,并且集合和映射不适用?)
4) 将此争议添加到README中(缺点:是否有人阅读README?)

我倾向于3或4。我很乐意做出这样的改变。

0

评论由:nathan

考虑第1点,对于除了size-1组合以外的任何东西,行为不会比现在更不纯。它也会与seq、vec、map或其他任何保持顺序的函数有相同的纯净度。例如(map inc some-set)对顺序有相同的警告。由于在隐藏顺序的数据结构上等价性和保持顺序的函数(揭示?)的问题远远大于组合函数,因此适当的等价性警告应该与隐藏顺序的对象本身一起。

在邮件列表上的讨论之余,我认为使用集合的原因之一是有意忽略顺序。我认为最好的建议是在测试之前将序列转换回集合。(set (map inc some-set))

我觉得如果我们不使map在集合并破,那么修复这里是有价值的。

0

评论由:nathan

我在组合问题上看到了一些问题。数学组合是无序的;但这些是列表。为了进行等式测试,您将使用:(set (map set (combinations some-set n)))

0

评论者:markengelberg

目前,我在README文件中用法说明的顶部添加了一条注释。集合中唯一真正的问题在于调用distinct,因此如果Clojure修改了distinct的代码以使其对集合有效(这似乎是一个微不足道的改动),则可以删除此注释。

0
参考资料:https://clojure.atlassian.net/browse/MCOMB-8(由glchapman报告)
...