Я пытаюсь передать (ленивую) последовательность, возвращенную из операции карты, в другую операцию карты, чтобы я мог искать элементы в первой последовательности.Код разбирает некоторые футбольные матчи из текстового файла (в формате строки / столбца), очищает его и затем возвращает карту.
Вот код:
(ns fixtures.test.lazytest
(:require [clojure.string :as str])
(:use [clojure.test]))
(defn- column-map
"Produce map with column labels given raw data, return nil if not enough columns"
[cols]
(let [trimmed-cols (map str/trim cols)
column-names {0 :fixture-type, 1 :division, 2 :home-team, 4 :away-team}]
(if (> (count cols) (apply max (keys column-names)))
(zipmap (vals column-names) (map trimmed-cols (keys column-names)))
nil)))
(deftest test-mapping
(let [cols '["L" " Premier " " Chelsea " "v" "\tArsenal "]
fixture (column-map cols)]
(is (= "Arsenal" (fixture :away-team)))
(is (= "Chelsea" (fixture :home-team)))
(is (= "Premier" (fixture :division)))
(is (= "L" (fixture :fixture-type)))
)
)
(run-tests 'fixtures.test.lazytest)
Я использую следующий подход:
- Очистить вектор данных столбца (удалить пробелы в начале / конце)
- Используя zipmap, объедините ключевые слова имени столбца с их соответствующим элементом в столбце.данные (обратите внимание, что используются не все столбцы)
Проблема в том, что использование trimmed-cols в zipmap приводит к
java.lang.ClassCastException: clojure.lang.LazySeq не может быть приведен к clojure.lang.IFn
Я думаю, я знаю, почему это происходит ... поскольку trimmed-cols является LazySeq,карта, вызванная из zipmap, возражает против получения не-функции в качестве первого аргумента.
Чтобы исправить это, я могу изменить let на:
trimmed-cols (vec (map str/trim cols))
Ноэто не похоже на «лучший» вариант.
Итак:
- Есть хороший генКакое решение использовать результат операции карты в качестве аргумента «функции» для другой карты?
- Существует ли лучший подход для получения карты пар {: value} из вектора необработанных данных значений, гдене все элементы вектора используются?
(стесняюсь спросить о идиоматическом решении, но представьте, что где-то должен быть общепринятый способ сделать это.)