2013-12-10 22 views
2

这是一个非常基本的问题,我敢打赌,但是对我来说,这是一个头疼的问题。我试图完成这个“介绍clojure”类问题(http://www.4clojure.com/problem/40),我需要设计我自己的干涉函数版本(并输出为矢量)。我用下面的函数做这个有点成功(顺序是正确的):使用Clojure函数铸造嵌套类型

(defn my-interpose[n x] (vector (interleave x (take (count x) (repeat n))))) 

然而,当我运行它,我得到一个奇怪的输出 - 这似乎是一个向量内部列表?下面是它看起来像我的REPL ...

=> (my-interpose 0 [1 2 3]) 
[(1 0 2 0 3 0)] 

基本上,我回来这个序列在括号(这是一个列表?),然后我尝试将其转换为载体并没有真正转化它,它似乎只是包装它。我也尝试过拼合功能无济于事。

任何人都可以解释如何解决,或者更重要的是,这种现象的性质(我称之为“嵌套类型”)是什么以及处理它的最佳实践方法是什么?

另外,我的结果是括号内的矢量列表吗?或者这个序列真的不是一个清单?

+0

在@Chuck的帮助下解决!最后的回答是,对于那些好奇的人(我重新排序并添加了其余的位,因为它并不意味着插入的字符尾随或领先)。 (fn my-interpose [n x](vec(rest(interleave(take(count x)(repeat n))x)))) – jm0

+1

顺便说一句,'take'是不必要的。你可以写'(vec(rest(interleave(repeat n)x)))'并获得相同的效果。或者,使用线程操作符,'( - >(repeat n)(interleave x)rest vec)'。 – Chuck

回答

4

这就是vector所做的 - 它接受它的参数并将它们放入向量中。我认为你想要的功能是vec,它需要一个集合并将其转换为向量。顺便说一下,向量中的集合本身并不是一个列表,而是一个LazySeq。

+0

Ahhhhh是的,我想我只是输入它,因为它是核心的一部分,我认为它是演员功能......非常感谢,特别是关于LazySeq的消息!我正准备尝试了解这些基础类型。 – jm0