如何在不使用可变状态的情况下减少嵌套集合?

时间:2013-04-28 19:30:51

标签: clojure

给定一个嵌套集合,我想将它简化为只有形式为[_ D]的k-v对,其中D是一个整数。例如,我想改变如下:

; Start with this  ...
{:a {:val 1 :val 2} :b {:val 3 :c {:val 4}} :val 5}

; ... end with this
{:val 1, :val 2, :val 3, :val 4, :val 5}

我用postwalk写了一个函数如下:

(defn mindwave-values [data]
  (let [values       (atom {})
        integer-walk (fn [x]
                       (if (map? x)
                         (doseq [[k v] x]
                           (if (integer? v) (swap! values assoc k v)))
                         x))]
    (postwalk integer-walk data)
    @values))

我很好奇是否可以在不使用可变状态的情况下这样做?

编辑原始功能不太正确。

1 个答案:

答案 0 :(得分:1)

您的示例数据结构不是合法地图,所以我稍微改了一下:

(defn int-vals [x]
  (cond (map? x) (mapcat int-vals x)
        (coll? x) (when (= 2 (count x))
                    (if (integer? (second x))
                      [x]
                      (int-vals (second x))))))

user> (int-vals {:a {:x 1 :y 2} :b {:val 3 :c {:val 4}} :val 5})
([:y 2] [:x 1] [:val 4] [:val 3] [:val 5])

您的要求有点模糊:您说“收藏”,但您的示例仅包含地图,因此我只需要猜测您的意图。