我正在遇到与解构相关的某种心理障碍......
(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})
会起作用但事实并非如此。
我想知道怎么做,如果你能解释为什么我的推理方式是假的,那就更好了......
答案 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