我是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])
如何“压扁”结构?
答案 0 :(得分:7)
concat
给你一个懒惰的seq。如果你想最终得到(非懒惰)矢量:
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]
根据您是通过索引大量访问它还是迭代它,可能更适合使用vector或seq。
如果你想要一个重复元素的无尽(懒惰)流,那么总是cycle
:
user> (take 9 (cycle suits))
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades :clubs)
答案 1 :(得分:2)
(未经测试!)
(apply concat (repeat 2 suits))
希望能够做到这一点。
concat
当然会连接2个列表; apply
可用于将给定函数走私到现有列表的头部位置以进行评估。
答案 2 :(得分:2)
使用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)
答案 3 :(得分:1)
(take (* 2 (count suits)) (cycle suits))