Clojure 中的奇怪顺序
Weird order in sets in Clojure
所以,我正在努力学习 Brave Clojure。第三个练习包括创建一个地图函数,但不是 return 一个列表,它应该 return 一个集合。好的,我开始了:
(defn mapset
[f lst]
(loop [[head & remaining] lst
final-set #{}]
(if (empty? remaining)
(into final-set #{(f head)})
(recur remaining
(into final-set #{(f head)})))))
但是奇怪的事情发生了。该功能可以正常工作。但是顺序全乱套了。我知道在数学中集合的顺序是无关紧要的,但我不禁想知道为什么会这样:
clojure-noob.core=> (mapset identity [1])
#{1}
clojure-noob.core=> (mapset identity [1 2])
#{1 2}
clojure-noob.core=> (mapset identity [1 2 3])
#{1 3 2}
clojure-noob.core=> (mapset identity [1 2 3 4])
#{1 4 3 2}
clojure-noob.core=> (mapset identity [1 2 3 4 5])
#{1 4 3 2 5}
clojure-noob.core=> (mapset identity [1 2 3 4 5 6])
#{1 4 6 3 2 5}
也不仅仅是恒等函数。
clojure-noob.core=> (mapset inc [1 2 3])
#{4 3 2}
这里发生了什么?
集合默认是无序的。因此,您的结果很好,它们包含正确的元素。一般来说,顺序对集合并不重要。
正如 ymonad 所说,Clojure 集是 "randomly" 有序的:
> (println #{ 1 2 3 4 5 } )
#{1 4 3 2 5}
文字集语法 #{1 2 3 4 5}
只是 (hash-set ...)
的缩写。您可以获得如图所示的排序集:
> (hash-set 1 2 3 4 5 6)
#{1 4 6 3 2 5}
> (sorted-set 1 2 3 4 5 6)
#{1 2 3 4 5 6}
> (into (sorted-set) #{1 2 3 4 5 6} )
#{1 2 3 4 5 6}
在最后一个示例中,我们使用 into
将常规集合中的元素添加到空 sorted-set
所以,我正在努力学习 Brave Clojure。第三个练习包括创建一个地图函数,但不是 return 一个列表,它应该 return 一个集合。好的,我开始了:
(defn mapset
[f lst]
(loop [[head & remaining] lst
final-set #{}]
(if (empty? remaining)
(into final-set #{(f head)})
(recur remaining
(into final-set #{(f head)})))))
但是奇怪的事情发生了。该功能可以正常工作。但是顺序全乱套了。我知道在数学中集合的顺序是无关紧要的,但我不禁想知道为什么会这样:
clojure-noob.core=> (mapset identity [1])
#{1}
clojure-noob.core=> (mapset identity [1 2])
#{1 2}
clojure-noob.core=> (mapset identity [1 2 3])
#{1 3 2}
clojure-noob.core=> (mapset identity [1 2 3 4])
#{1 4 3 2}
clojure-noob.core=> (mapset identity [1 2 3 4 5])
#{1 4 3 2 5}
clojure-noob.core=> (mapset identity [1 2 3 4 5 6])
#{1 4 6 3 2 5}
也不仅仅是恒等函数。
clojure-noob.core=> (mapset inc [1 2 3])
#{4 3 2}
这里发生了什么?
集合默认是无序的。因此,您的结果很好,它们包含正确的元素。一般来说,顺序对集合并不重要。
正如 ymonad 所说,Clojure 集是 "randomly" 有序的:
> (println #{ 1 2 3 4 5 } )
#{1 4 3 2 5}
文字集语法 #{1 2 3 4 5}
只是 (hash-set ...)
的缩写。您可以获得如图所示的排序集:
> (hash-set 1 2 3 4 5 6)
#{1 4 6 3 2 5}
> (sorted-set 1 2 3 4 5 6)
#{1 2 3 4 5 6}
> (into (sorted-set) #{1 2 3 4 5 6} )
#{1 2 3 4 5 6}
在最后一个示例中,我们使用 into
将常规集合中的元素添加到空 sorted-set