Возвращение последовательности из функции - PullRequest
1 голос
/ 11 октября 2011

Я собрал функцию ниже. Предполагается взять вложенную (многоуровневую) карту и вернуть последовательность плоских карт; однако в настоящее время он возвращает последовательность внутри последовательности.

Кто-нибудь знает, почему последовательность вложена в другую последовательность?

(defn collapse [data & keys-coll]
  (if (map? data)
    (for [[k v] data]
      (collapse v (if (nil? keys-coll)
                    (conj [] k)
                    (conj (into [] keys-coll) k))))
    (hash-map (flatten keys-coll) data)))

(collapse {"a" {2011 [["a" 2011 "dan"] ["a" 2011 "ari"]] 2010 [["a" 2010 "jon"]]}})

Результат:

<strong>(</strong> ({("a" 2011) [["a" 2011 "dan"] ["a" 2011 "ari"]]}
   {("a" 2010) [["a" 2010 "jon"]]}) <strong>)</strong>

Ожидаемый / желаемый результат (обратите внимание на последовательность, а НЕ последовательность в последовательности, как указано выше):

({("a" 2011) [["a" 2011 "dan"] ["a" 2011 "ari"]]}
 {("a" 2010) [["a" 2010 "jon"]]})

Примечание : ожидаемый результат - последовательность карт; каждая карта состоит из составных ключей и вложенных векторов.

1 Ответ

1 голос
/ 12 октября 2011

Причина, по которой вы получаете последовательность в другой последовательности, заключается в том, что for возвращает ленивый seq. Поскольку он вызывается каждый раз, когда collapse встречается с картой, а карта, которую вы предоставляете, вложена на два уровня глубже, вы получаете последовательности, вложенные на два уровня глубиной.

Быстрое исправление: поставьте flatten перед for примерно так:

(defn collapse [data & keys-coll]
  (if (map? data)
    (flatten 
     (for [[k v] data]
       (collapse v (conj keys-coll k))))
    (hash-map (flatten keys-coll) data))

(обратите внимание, что вы также можете избавиться от оператора if). Возможно, не самое элегантное решение, но страдающее от замерзания мозга прямо сейчас ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...