标签: graph clojure tree traversal
如何在惯用的Clojure中表达以下转变?
(def m {:a {:b {:c nil :d nil}} :e nil}}) (map->edges m) ; => ([:a :b] [:b :c] [:b :d] [:e nil] [:d nil] [:a :e] [:e nil])
我不关心矢量在结果中出现的顺序,因此深度优先或先呼吸搜索策略都可以。
答案 0 :(得分:8)
您可以使用for和tree-seq
for
tree-seq
(defn map->edges [m] (for [entry m [x m] (tree-seq some? val entry) y (or (keys m) [m])] [x y]))
示例:
(map->edges m) ;;=> ([:a :b] [:a :e] [:b :c] [:b :d] [:c nil] [:d nil] [:e nil])