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

欢迎!请参阅关于页面以获取更多有关本站信息的工作方式。

0
math.combinatorics
想要将 Clojure 集合作为组合函数的参数项看起来是合理的。然而,在使用 {{(combinations some-set 1)}} 的例子中,由于 Clojure 的 distinct 函数(在 {{(= t 1)}} 时被调用)不支持集合,因此抛出了一个异常。通过在调用 combinations 之前将集合转换为 seq,可以绕过这个问题。

对于所有其他函数,似乎扩展 {{all-different?}} 以添加一个 {{set?}} 检查可以使函数稍微高效一些(通过避免线性的 {{distinct?}} 扫描)。

8 答案

0

由: glchapman

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

0

由: markengelberg

在此处查看讨论:https://groups.google.com/forum/#!topic/clojure/XUEqdCSI6c4

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

我认为最好强制用户直接应用序列,而不是隐式地进行处理,这样他/她就可以考虑后果,并可能执行某种排序确保一系列一致的输出,如果需要的话。

0

评论者:nathan

无论是否修复,至少需要对文档字符串进行编辑。

就目前来看,组合操作将正常运行,直到遇到大小为1的特殊情况。这种隐藏的陷阱需要进行某种类型的修复。
对排序问题进行强制操作将包括抛出异常、显示警告或在集合上统一导致函数错误。

0

由: markengelberg

我同意当前行为不可取。可能的解决方案有

1) 对所有输入隐式调用seq(缺点:函数不再纯净)
2) 在集合上抛出错误(缺点:增加了运行时检查)
3) 在文档字符串中添加信息,说明输入必须是顺序的(缺点:需要阅读文档字符串以了解约束,每个人都知道“顺序”的含义吗?以及集合和映射不符合条件?)
4) 将对此问题的讨论添加到README中(缺点:是否有人阅读README?)

我倾向于3或4。我愿意进行这些方面的改变。

0

评论者:nathan

思考问题#1,对于大小不是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](https://clojure.atlassian.net/browse/MCOMB-8)(由glchapman报告)
...