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

つまり、コレクションがあり、その関数を呼び出したい場合は、次のような適用関数を使用する必要があります。

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}

空の sorted-set を作成し、コレクションのすべての要素をそれに追加することもできます。

(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 に答える