clojure中嵌套映射的默认值

clojure中嵌套映射的默认值,clojure,functional-programming,Clojure,Functional Programming,我已经研究clojure有一段时间了,但是我找不到一个可以为嵌套映射提供默认值的函数。例如,如果我有一张如下所示的地图 (def paths {:A {:B 5, :D 5, :E 7}, :B {:C 4}, :C {:D 8, :E 2}, :D {:C 8, :E 6}, :E {:B 3} }) 我想要一个函数,从给定的散列映射创建一个映射,如下所示 {:A {:B

我已经研究clojure有一段时间了,但是我找不到一个可以为嵌套映射提供默认值的函数。例如,如果我有一张如下所示的地图

(def paths {:A {:B 5, :D 5, :E 7},
            :B {:C 4},
            :C {:D 8, :E 2},
            :D {:C 8, :E 6},
            :E {:B 3}
            })
我想要一个函数,从给定的散列映射创建一个映射,如下所示

{:A {:B 5, :C default_val :D 5, :E 7},
            :B {:A default_val, :C 4, :D default_val, :E default_val},
            :C {:A default_val, :B default_val, :C default_val, :D 8, :E 2},
            :D {:A default_val, :B default_val,  :C 8, :D default_val, :E 6},
            :E {:A default_val, :B 3,  :C 8, :D default_val, :E 3}
            }

通过阅读您的示例,很难准确判断您希望何时包含默认值,尽管有一种非常常见的模式,即提供一组默认值并将输入合并到其中,以便在给定值时使用该值,如果某个特定键没有该值,则使用默认值:

user> (def default-values {:A :default :B :default :C :default :D :default})
#'user/default-values

user> (def paths {:A {:B 5, :D 5, :E 7},
            :B {:C 4},
            :C {:D 8, :E 2},
            :D {:C 8, :E 6},
            :E {:B 3}})
#'user/paths

user> (keys paths)
(:A :D :B :C :E)

user> (vals paths)
({:D 5, :B 5, :E 7} {:C 8, :E 6} {:C 4} {:D 8, :E 2} {:B 3})

user> (map #(merge default-values %) (vals paths))
({:A :default, :D 5, :B 5, :C :default, :E 7} 
 {:A :default, :D :default, :B :default, :C 8, :E 6} 
 {:A :default, :D :default, :B :default, :C 4}
 {:A :default, :D 8, :B :default, :C :default, :E 2} 
 {:A :default, :D :default, :B 3, :C :default})

user> (clojure.pprint/pprint
       (zipmap (keys paths) 
               (map #(merge default-values %) 
                    (vals paths))))
{:E {:A :default, :D :default, :B 3, :C :default},
 :C {:A :default, :D 8, :B :default, :C :default, :E 2},
 :B {:A :default, :D :default, :B :default, :C 4},
 :D {:A :default, :D :default, :B :default, :C 8, :E 6},
 :A {:A :default, :D 5, :B 5, :C :default, :E 7}}

是的,这正是我想要的。谢谢:)