1

我遇到了某种与解构相关的心理障碍……

(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})

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

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

4

1 回答 1

6

sorted-set 函数参数是一个 var-arg: [& 键],这意味着如果你有一个集合并且你想调用该函数,你需要使用 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 来调用函数并创建排序集:

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
于 2012-07-04T16:13:20.700 回答