【发布时间】:2019-01-07 14:48:31
【问题描述】:
(vec #{1 2 3}) 是否保证总是返回 [1 3 2] 或者顺序可能不同?
我对这背后的实现细节不是很感兴趣,而是从无序到有序,以保持我的函数纯粹且易于测试。
【问题讨论】:
-
套装是无序的,因此无法保证顺序。如果您需要订购,请使用
sorted-set。 -
如果要测试设定值,请将它们与设定值进行比较。集合的顺序未定义,因此您绝不能依赖它。
-
那么返回
(vec #{1 2 3})的函数不是纯函数吗? -
@John 这是纯粹的。您获得的确切顺序不容易预测,但对于给定的集合,您应该每次都收到相同的
seq'd 序列。您需要查看APersistentSet究竟是如何实现seq以了解订单是如何确定的。我相信虽然它取决于集合中元素的散列,并且可能取决于集合的大小。 -
一旦你将物品放入一个集合中,你就失去了任何有意义的顺序。如果数据的确切顺序在您的程序中意味着什么,您可能不应该使用普通集合,或者您应该与集合一起维护第二个有序集合。
标签: clojure functional-programming referential-transparency