从集合到有序集合

时间:2012-07-04 16:08:23

标签: clojure destructuring

我正在遇到与解构相关的某种心理障碍......

(sorted-set 4 2 5)

给出:

#{2 4 5}

但我如何从以下方式获得相同的排序集:

((fn [???] (sorted-set ???)) [4 2 5])

或从作为参数传递的集合(未分类):

((fn [???] (sorted-set ???)) #{4 2 5})  

我尝试了几次解构,我在想:

((fn [#{elems}] (sorted-set elems)) #{4 2 5})

会起作用但事实并非如此。

我想知道怎么做,如果你能解释为什么我的推理方式是假的,那就更好了......

1 个答案:

答案 0 :(得分:6)

sorted-set函数param是var-arg:[& keys],这意味着如果你有一个集合并且想要调用该函数,你需要使用apply函数,如:

user=> (def v [4 8 2])
#'user/v
user=> (apply sorted-set v)
#{2 4 8}

接受集合并返回排序集的函数的签名如下:

user=> (defn to-ss [c] (apply sorted-set c))
#'user/to-ss
user=> (to-ss v)
#{2 4 8}

您还可以创建一个空的排序集,然后将集合的所有元素添加到其中:

(defn to-ss [c] (into (sorted-set) c))

请注意,如果要使用var-arg参数定义函数,则需要使用apply来调用函数并创建sorted-set:

user=> (defn to-ss [& items] (apply sorted-set items))
#'user/to-ss
user=> (apply to-ss v)
#{2 4 8} <-- expected value
user=> (to-ss v)
#{[4 8 2]} <-- sorted-set with just one value