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

欢迎!请参阅关于页面,了解有关此如何工作的更多详细信息。

0
math.combinatorics
使用clojure集合作为组合函数的items参数似乎是合理的。然而,在{{(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

我认为将集合并作为有效输入并不一定合理。这些算法返回的内容非常依赖于元素在seq中的顺序。由于集合并是无序的,这种改变会使这些算法不是纯函数,即,对于相同的(相等的)输入,它们可能返回完全不同的输出。这是因为两个相等的集合并可能在不同应用seq时返回不同元素顺序。这可能会中止使用集合并调用这些函数的用户在测试用例中的函数。

我认为最好强迫用户直接应用 seq,而不是隐式地应用它,这样他/她可以思考结果,并可能做一些某种类型的 seq 或其他操作来确保一致性的输出,如果需要的话。

0

评论者:nathan

修复与否,至少需要编辑文档字符串。

按照现在的形式,combinations (组合) 会正常工作,直到达到单点 corner-case (角落情况)。这种隐藏的地雷需要某种形式的修复。
强迫在排序问题上进行操作将涉及抛出异常、弹出警告或将函数在集合上一致地出错。

0

评论者:markengelberg

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

1) 隐式调用 seq 对所有输入(缺点:不再是纯函数)
2) 当集合上抛出错误(缺点:增加运行时检查)
3) 在文档字符串中添加信息,说明输入必须是序列(缺点:需要读取文档字符串以了解约束,每个人都明白“序列”是什么意思,集合和映射不符合吗?)
4) 在 README 中添加关于此点的讨论(缺点:有谁看 README?)

我会倾向于 3 或 4。我很高兴在这种方式上做出更改。

0

评论者:nathan

考虑 #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报告)
...