欢迎!有关如何使用本网站的信息,请参阅关于页面。
评论由:glchapman发表
我进一步探讨了一下:看起来{{nth-permutation-distinct}}会调用它的{{l}}参数上的{{nth}}。集合不支持{{nth}},因此更好的集合支持将需要更改该函数。
评论由:markengelberg发表
在此处查看讨论:https://groups.google.com/forum/#!topic/clojure/XUEqdCSI6c4
我认为将集合作为有效输入并不一定是有意义的。这些算法返回的结果非常依赖于元素在seq中的顺序。由于集合是无序的,这样的更改将使得这些不是纯函数,即对于相同的(相等的)输入,它们可能返回完全不同的输出。这是因为比较为相等的两个集合在应用seq时可能会返回不同顺序的元素。这可能会给人们在调用带有集合的函数时的测试用例造成灾难。
我认为强制用户直接应用seq比隐式发生更好,这样他们可以思考后果,并且在需要的情况下确保一致输出,进行一定的seq或其他操作。
评论者:nathan
无论修复与否,至少需要编辑文档字符串。
目前,组合将正常工作,直到遇到大小为1的角落情况。需要对该类隐藏的陷阱进行某种形式的修复。在顺序问题上强制操作可能包括抛出异常,弹出警告或使函数在集合上持续出错。
我同意当前行为不友好。可能的解决方案有
1) 对所有输入隐式调用seq(缺点:不再是纯函数)2) 在集合上抛出错误(缺点:增加了运行时检查)3) 在文档字符串中添加信息,说明输入必须是序列(缺点:需要阅读文档字符串来了解约束,每个人都知道“序列”是什么意思吗?集合和映射不满足这种条件?)4) 在README中添加对此点的讨论(缺点:谁会阅读README?)
我倾向于选择3或4。我愿意进行相应的更改。
考虑第一个方案,对于除大小为1的组合之外的所有组合,行为不会比现在更不纯。它将与seq、vec、map或其他任何保持顺序函数具有相同的纯净度。(map inc some-set)具有相同的关于顺序的注意事项。由于在隐藏顺序的数据结构和保持顺序(揭示?)函数上的等价性问题远比组合函数问题要大得多,因此适当的等价性警告应该与隐藏顺序对象本身相关。
考虑到邮件列表上的讨论,人们使用集合的原因之一就是故意忽略顺序。我认为最好的建议是在测试之前将序列转换回集合。(set (map inc some-set))
我认为如果不会让map在集合上破裂,那么修复这里是值得的。
我看到了组合的一些问题。数学组合是无序的;但这些是列表。对于等价性测试,您将使用:(set (map set (combinations some-set n)))
目前,我在README文件的使用说明的顶部添加了一条注释。对于集合而言,唯一真正出问题的是对distinct的调用,因此如果Clojure对distinct的代码进行了修改以使其在集合上工作(这似乎是一个非常简单的更改),那么这个注释可以删除。
distinct