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

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

目前,组合将正常工作,直到遇到大小为1的角落情况。需要对该类隐藏的陷阱进行某种形式的修复。
在顺序问题上强制操作可能包括抛出异常,弹出警告或使函数在集合上持续出错。

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
href("../../index.php/7571/better-support-for-sets?show=7581#a7581" class="qa-a-item-what" itemprop="url">回答了

评论者: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报告)
...