从集合到有序集合

Ced*_*tin 1 clojure destructuring

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

(sorted-set 4 2 5)
Run Code Online (Sandbox Code Playgroud)

得到:

#{2 4 5}
Run Code Online (Sandbox Code Playgroud)

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

((fn [???] (sorted-set ???)) [4 2 5])
Run Code Online (Sandbox Code Playgroud)

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

((fn [???] (sorted-set ???)) #{4 2 5})  
Run Code Online (Sandbox Code Playgroud)

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

((fn [#{elems}] (sorted-set elems)) #{4 2 5})
Run Code Online (Sandbox Code Playgroud)

会工作但事实并非如此.

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

Dan*_*ero 6

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

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

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

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

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

(defn to-ss [c] (into (sorted-set) c))
Run Code Online (Sandbox Code Playgroud)

请注意,如果要使用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
Run Code Online (Sandbox Code Playgroud)