Повторение векторов в Clojure

Я - новичок Clojure. Я пытаюсь получить две копии вектора исков карты. Не-DRY способ, которым я могу придумать,

(def suits [:clubs :diamonds :hearts :spades])
(def two-times (concat suits suits))

Должен быть более функциональный путь (даже если требуется больше символов :-)). Что, если я хочу времена N? Какие-либо предложения?

Все вещи я пробую, как

(replicate 2 suits)

результаты в двух отдельных векторах:

([:clubs :diamonds :hearts :spades] [:clubs :diamonds :hearts :spades])

Как я "сглаживаю" структуру?

6
задан HostileFork 8 October 2012 в 04:26
поделиться

4 ответа

concat дает вам ленивую последовательность. Если вы хотите вместо этого получить (неленивый) вектор:

user> (into suits suits)
[:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades]
user> (reduce into (replicate 2 suits))
[:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades]

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

Всегда есть цикл , если вам нужен бесконечный (ленивый) поток повторяющихся элементов:

user> (take 9 (cycle suits))
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades :clubs)
8
ответ дан 8 December 2019 в 18:34
поделиться

(непроверено!)

(apply concat (repeat 2 suits))

, надеюсь, поможет.

concat , конечно, объединит 2 списка; apply может использоваться, чтобы переместить заданную функцию в начало существующего списка для оценки.

2
ответ дан 8 December 2019 в 18:34
поделиться

Небольшие эксперименты с REPL привели меня к следующему решению:

user=> (def suits [:clubs :diamonds :hearts :spades])
#'user/suits
user=> suits
[:clubs :diamonds :hearts :spades]    
user=> (reduce concat (replicate 2 suits))
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades)
2
ответ дан 8 December 2019 в 18:34
поделиться
(take (* 2 (count suits)) (cycle suits))
1
ответ дан 8 December 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: