1

任意にネストされたデータ構造をトラバースするメカニズムが必要です。次に、すべてのノードに fn を適用し、各ポイントで fn が true を返したかどうかを確認します。

フラットな構造でこれを行うのは簡単です -

(walk (complement string?) #(every? true? %) [ 1 2 3 4])

ただし、ウォークはネストされたものでは機能しません-

(walk (complement string?) #(every? true? %) [ 1 2 3 [ "a" ]])

フォームの 1 つとしてマップを使用し、マップ内の各値にも fn を適用する必要があるため、flatten のみを使用しても機能しません。これが私が持つ構造です -

[ ["2012" [{:a 2} {:b 3}]] ["2013" [{:a 2} {:b 3}]] ]

上記をトラバースするだけの fn を簡単に記述して、各 val に fn を適用できます。しかし、トラバースのための一般的なメカニズムを書く方法はありますか?

4

1 に答える 1

3

tree-seq はあなたが望むものかもしれません

(every? (complement string?)
        (remove coll?
                (tree-seq coll? #(if (map? %)
                                   (vals %)
                                   %)
                          [["2012" [{:a 2} {:b 3}]] ["2013" [{:a 2} {:b 3}]]])))
;; false

(every? (complement string?)
        (remove coll?
                (tree-seq coll? #(if (map? %)
                                   (vals %)
                                   %)
                          [[2012 [{:a 2} {:b 3}]] [2013 [{:a 2} {:b 3}]]])))
;; true
于 2013-04-09T15:42:01.223 に答える