欢迎!请参阅关于页面,了解有关此如何工作的更多详细信息。
评论者:glchapman
我进一步查看了一下:看起来{{nth-permutation-distinct}}将在其{{l}}参数上调用{{nth}}。集合并不支持{{nth}},因此更好的集合并支持需要更改该函数。
评论者:markengelberg
在此处查看讨论: https://groups.google.com/forum/#!topic/clojure/XUEqdCSI6c4
我认为将集合并作为有效输入并不一定合理。这些算法返回的内容非常依赖于元素在seq中的顺序。由于集合并是无序的,这种改变会使这些算法不是纯函数,即,对于相同的(相等的)输入,它们可能返回完全不同的输出。这是因为两个相等的集合并可能在不同应用seq时返回不同元素顺序。这可能会中止使用集合并调用这些函数的用户在测试用例中的函数。
我认为最好强迫用户直接应用 seq,而不是隐式地应用它,这样他/她可以思考结果,并可能做一些某种类型的 seq 或其他操作来确保一致性的输出,如果需要的话。
评论者:nathan
修复与否,至少需要编辑文档字符串。
按照现在的形式,combinations (组合) 会正常工作,直到达到单点 corner-case (角落情况)。这种隐藏的地雷需要某种形式的修复。强迫在排序问题上进行操作将涉及抛出异常、弹出警告或将函数在集合上一致地出错。
我同意当前行为不友好。可能的解决方案有
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