6

我是 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])

我如何“扁平化”结构?

4

4 回答 4

8

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]

根据您是通过索引大量访问它还是对其进行迭代,向量或序列可能更合适。

cycle如果你想要一个无休止的(懒惰的)重复元素流,也总是有:

user> (take 9 (cycle suits))
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades :clubs)
于 2010-04-23T19:06:57.060 回答
2

(未经测试!)

(apply concat (repeat 2 suits))

希望能解决问题。

concat当然会连接2个列表;apply可用于将给定函数偷运到现有列表的头部位置以进行评估。

于 2010-04-23T18:37:34.887 回答
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)
于 2010-04-23T18:46:37.443 回答
1
(take (* 2 (count suits)) (cycle suits))
于 2010-04-24T18:02:46.163 回答