Clojure的减少函数如何工作以反转列表而不是向量

ade*_*sin 1 clojure

我正在研究如何在不使用该reverse功能的情况下使用Clojure来反转集合,并偶然发现了这个解决方案.

(reduce conj '() [1 2 3 4 5]) => (5 4 3 2 1) 
Run Code Online (Sandbox Code Playgroud)

我已经阅读了关于如何减少工作的Clojure api,但我仍然对它在这种情况下如何工作感到困惑.

另外我发现如果我传递一个向量作为第三个参数而不是列表,即:

(reduce conj [] [1 2 3 4 5]) => [1 2 3 4 5]
Run Code Online (Sandbox Code Playgroud)

我好像回到了同一个向量.

我想知道是否有人可以给我一个简短的解释,说明reduce两种情况下的工作方式.

另外我发现这个方法也反转了一个向量:

(into () [1 2 3 4]) => (4 3 2 1) ; ???
Run Code Online (Sandbox Code Playgroud)

min*_*49r 5

doc字符串说:conj [oin].返回xs'已添加'的新集合.(conj nil item)返回(item)."添加"可能发生在不同的"地方",具体取决于具体类型.

对于矢量,添加的自然位置是结束.对于列表,添加的自然位置是前面(与'cons'一样).