在 clojure 中,您有几个函数对 vector 和 list 的作用不同。我有两个问题。
1)它有什么用?
我相信 clojure 的创造者有很好的理由这样做,但我不知道。
2)你如何让这些函数的类型安全变体无论数据在列表还是向量中都以相同的方式运行?
定义的函数 conj 具有以下行为
(conj [1 2 3] 4)
[1 2 3 4]
(conj '(1 2 3) 4)
(4 1 2 3)
我想要一个具有以下行为的函数 my-conj
(my-conj [1 2 3] 4)
[1 2 3 4]
(my-conj '(1 2 3) 4)
(1 2 3 4)
还有其他函数(cons、into、peek、pop)具有相同的行为,所以如果这种结构可以很容易地适应所有这些,那就太好了。
最佳答案
由于数据结构的实现方式,让它们的行为略有不同会更有效。例如,在列表的开头添加项目很容易(概念上只是将项目链接到现有列表的开头),但很难在向量的开头添加项目(概念上将现有项目向上移动索引),反之亦然。
替代方案是一致的 conj,但最坏情况的复杂性要差得多。
(有关性能保证表,请参阅 http://www.innoq.com/blog/st/2010/04/clojure_performance_guarantees.html)